目录

爬虫流程及方法04(Scrapy框架)

安装scrapy

pycharm安装步骤:
1.打开左上角file
2.打开Other Setting下的Setting for New Project
3.在Project Interpreter选择Project Interpreter里你使用的编译器后,点击加号(+)添加包

https://pic.liesio.com/2020/04/17/50187a9d453a1.png

4.修改Manage Repositories(参考第三方下载包修改篇)
5.在搜索框里搜索以下包名xxx(注意字母大小写不同)

1
2
3
4
Scrapy
Twisted
pywin32
wheel

https://pic.liesio.com/2020/04/17/5a07d6374190d.png

6.在terminal窗口输入scrapy确认出现版本信息及命令提示

https://pic.liesio.com/2020/04/17/47c822b71eabc.png

step1:

建立工程文档
终端terminal输入:

1
scrapy startproject 工程文档名

创建得到的文档结构:

工程文档名/  ----->外层目录

    scrapy.cfg ----->部署scrapy爬虫的配置文件

    工程文档名/ ---->scrapy框架的用户自定义的python代码

        _init_.py  ----->初始化脚本

        items.py  ----->items代码模块(继承类)

        middlewares.py  ----->middlewares代码模块(继承类)

        pipelines.py ------>pipelines代码模板(继承类)

        setting.py ------>scrapy爬虫的配置文件

        spiders/ ------>代码模板目录(继承类)

step2:

产生爬虫
终端terminal输入:(cmd内或pycharm里面的terminal)

1
2
cd 工程文档名
scrapy genspider demo 爬取页面的url
或者:

直接在含spider的目录下新建demo.py文件
写入以下代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import scrapy


class DemoSpider(scrapy.Spider):
    name = "demo"
    allowed_domain = ["python123.io"]#爬取该域名下的链接
    start_urls = ['https://python123.io/']#爬取页面的初始页面

    def parse(self, response):#解析页面方法类,形成字典类型或发现新链接
        pass

step3:

配置产生的spider爬虫(具体修改demo文件)
eg:

1
2
3
4
5
def parse(self, response):
    fname = response.url.split('/')[-1]
    with open(fname, 'wb') as f:
        f.write(response.body)
    self.log('Saved file %s.' % fname)

step4:

终端terminal运行:
输入以下代码

1
2
scrapy crawl 文件名
eg:scrapy crawl demo

ps:(爬虫的另一种框架)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import scrapy:


class DemoSpider(scrapy.Spider):
    name = "demo"

    def start requests(se1f):
        urls = [
                  'http://python123.io/ws/demo.html '
               ]
        for url in urls:
            yield scrapy.Request(ur1=ur1,callback=self.parse)

    def parse(self,response):
        fname = response.url.split('/')[-1]
        with open (fname,'wb') as f:
            f. write (response.body)
        self.log('Saved file %s.' % fname)

yield关键字

yield —->生成器
优势:占用存储少,响应速度快
生成器是一个不断产生值的函数,包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
生成器写法

1
2
3
4
5
6
def gen(n):
    for i in range(n):
        yield i**2

for 1 in gen(5):
    print(1,"  ",end="")

结果

1
>>>0  1    4   9   16

一般写法

1
2
3
4
5
def square(n) :
    ls =[i**2 for i in range (n) ]
    return ls
for i in square (5) :
    print(i,"   ",end="")

结果

1
>>>0   1   4   9   16