pythonscrapy爬虫_Scrapy爬虫框架

一、scrapy爬虫框架结构

1、scrapy不是一个函数功能库,而是一个爬虫框架

爬虫框架是实现爬虫功能的一个软件结构和功能组件集合

爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫

2、“5+2”结构

b_0_202003191417213841.png

(1)engine(不需要用户修改)

控制所有模块之间的数据流

根据条件触发事件

(2)downloader(不需要用户修改)

根据请求下载网页

scheduler(不需要用户修改)

对所有爬取请求进行调度管理

(3)downloader middleware

目的:实施engine、scheduler、和downloader之间进行用户可配置的控制

功能:修改、丢弃、新增请求或响应

用户可以编写配置代码

(4)spider

解析downloader返回的响应(response)

产生爬取项(scrapy item)

产生额外的爬取请求(request)

需要用户编写配置代码

(5)item pipelines

以流水线方式处理spider产生的爬取项

由一组操作顺序组成,类似流水线,每个操作是一个item pipelines类型

可能操作包括:清理、检验和查重爬取项中的html数据、将数据存储到数据库

(6)spider middleware

目的:对请求和爬取项的再处理

功能:修改、丢弃、新增请求或爬取项

用户可以编写配置代码

二、request库与scrapy爬虫的比较

1、相同点

两者都可以进行页面请求和爬取,python爬虫的两个重要技术路线

两者可用性都好,文档丰富,入门简单

两者都没有处理js、提交表单、应对验证码等功能(可扩展)

2、不同点

request

scrapy

页面级爬虫

网站级爬虫

功能库

框架

并发性考虑不足,性能较差

并发性好,性能较高

重点在于页面下载

重点在于爬虫结构

定制灵活

一般定制灵活,深度定制困难

上手十分简单

入门稍难

三、scrapy命令行

scrapy是为持续运行设计的专业爬虫框架,提供操作的scrapy命令行

1、命令行格式

1 scrapy [options] [args]

2、scrapy常用命令

命令

说明

格式

startproject

创建一个新工程

scrapy startproject[dir]

genspider

创建一个爬虫

scrapy genspider[options]

settings

获取爬虫配置信息

scrapy settings[options]

crawl

运行一个爬虫

scrapy crawl

list

列出工程中所有爬虫

scrapy list

shell

启动url调式命令行

scrapy shell[url]

四、实例

1、建立一个scrapy爬虫工程

命令行语句

1 scrapy startproject python123demo #新建一个“python123demo”工程名的爬虫工程

工程目录为d:\codes\python>

1 d:\codes\python>scrapy startproject python123demo

2 new scrapy project 'python123demo', using template directory 'd:\codes\python\venv\lib\site-packages\scrapy\templates\project', created in:

3 d:\codes\python\python123demo

4

5 you can start your first spider with:

6 cd python123demo

7 scrapy genspider example example.com

b_0_202003191417226696.jpg

python123demo/    外层目录

b_0_202003191417229425.jpg

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

python123demo/     scrapy框架的用户自定义python代码

b_0_202003191417231868.jpg

_init_.py         初始化脚本

items.py         items代码模板(继承类)

middlewares.py     middlewares代码模板(继承类)

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

settings.py        scrapy爬虫的配置文件

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

b_0_202003191417249396.jpg

_init_.py      初始文件,无需修改

_pycache_/     缓存目录,无需修改

2、在工程中产生一个scrapy爬虫

命令行语句

1 1 cd python123demo #打开python123demo文件夹

2 2 scrapy genspider demo python123.io #创建爬虫

先打开文件目录,再进行产生爬虫

1 d:\codes\python>cd python123demo

2

3 (venv) d:\codes\python\python123demo>scrapy genspider demo python123.io

4 created spider 'demo' using template 'basic' in module:

5 python123demo.spiders.demo

此时在spiders文件夹下会生成一个demo.py文件

b_0_202003191417243125.jpg

内容为

1 # -*- coding: utf-8 -*-

2 import scrapy

3

4

5 class demospider(scrapy.spider):

6 name = 'demo'

7 allowed_domains = ['python123.io']

8 start_urls = ['http://python123.io/']

9

10 def parse(self, response):

11 pass

parse()用于处理响应,解析内容形成字典,发现新的url爬取请求

3、配置产生的spider爬虫

修改demo.py内容

1 # -*- coding: utf-8 -*-

2 import scrapy

3

4

5 class demospider(scrapy.spider):

6 name = 'demo'

7 #allowed_domains = ['python123.io']

8 start_urls = ['http://python123.io/ws/demo.html']

9

10 def parse(self, response):

11 fname = response.url.split('/')[-1]

12 with open(fname,'wb') as f:

13 f.write(response.body) #将返回的内容保存为文件

14 self.log('saved file %s.'% fname)

4、运行爬虫,获取网页

命令行

1 scrapy crawl demo

运行爬虫

1 d:\codes\python\python123demo>scrapy crawl demo

2 2020-03-19 11:25:40 [scrapy.utils.log] info: scrapy 2.0.0 started (bot: python123demo)

3 2020-03-19 11:25:40 [scrapy.utils.log] info: versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, twisted 19.10.0, python 3.8.1 (tags/v3.8.1:1b293b6, dec 18 2019, 22:39:24) [msc v.1916 32 bit (intel)], pyopenssl 19.1.0 (openssl 1.1.1d

4 10 sep 2019), cryptography 2.8, platform windows-10-10.0.18362-sp0

5 2020-03-19 11:25:40 [scrapy.utils.log] debug: using reactor: twisted.internet.selectreactor.selectreactor

6 2020-03-19 11:25:41 [scrapy.crawler] info: overridden settings:

7 {'bot_name': 'python123demo',

8 'newspider_module': 'python123demo.spiders',

9 'robotstxt_obey': true,

10 'spider_modules': ['python123demo.spiders']}

11 2020-03-19 11:25:41 [scrapy.extensions.telnet] info: telnet password: dbe958957137573b

12 2020-03-19 11:25:41 [scrapy.middleware] info: enabled extensions:

13 ['scrapy.extensions.corestats.corestats',

14 'scrapy.extensions.telnet.telnetconsole',

15 'scrapy.extensions.logstats.logstats']

16 2020-03-19 11:25:42 [scrapy.middleware] info: enabled downloader middlewares:

17 ['scrapy.downloadermiddlewares.robotstxt.robotstxtmiddleware',

18 'scrapy.downloadermiddlewares.httpauth.httpauthmiddleware',

19 'scrapy.downloadermiddlewares.downloadtimeout.downloadtimeoutmiddleware',

20 'scrapy.downloadermiddlewares.defaultheaders.defaultheadersmiddleware',

21 'scrapy.downloadermiddlewares.useragent.useragentmiddleware',

22 'scrapy.downloadermiddlewares.retry.retrymiddleware',

23 'scrapy.downloadermiddlewares.redirect.metarefreshmiddleware',

24 'scrapy.downloadermiddlewares.httpcompression.httpcompressionmiddleware',

25 'scrapy.downloadermiddlewares.redirect.redirectmiddleware',

26 'scrapy.downloadermiddlewares.cookies.cookiesmiddleware',

27 'scrapy.downloadermiddlewares.httpproxy.httpproxymiddleware',

28 'scrapy.downloadermiddlewares.stats.downloaderstats']

29 2020-03-19 11:25:42 [scrapy.middleware] info: enabled spider middlewares:

30 ['scrapy.spidermiddlewares.httperror.httperrormiddleware',

31 'scrapy.spidermiddlewares.offsite.offsitemiddleware',

32 'scrapy.spidermiddlewares.referer.referermiddleware',

33 'scrapy.spidermiddlewares.urllength.urllengthmiddleware',

34 'scrapy.spidermiddlewares.depth.depthmiddleware']

35 2020-03-19 11:25:42 [scrapy.middleware] info: enabled item pipelines:

36 []

37 2020-03-19 11:25:42 [scrapy.core.engine] info: spider opened

38 2020-03-19 11:25:42 [scrapy.extensions.logstats] info: crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

39 2020-03-19 11:25:42 [scrapy.extensions.telnet] info: telnet console listening on 127.0.0.1:6023

40 2020-03-19 11:25:42 [scrapy.downloadermiddlewares.redirect] debug: redirecting (301) to from

41 2020-03-19 11:25:42 [scrapy.core.engine] debug: crawled (404) (referer: none)

42 2020-03-19 11:25:42 [scrapy.downloadermiddlewares.redirect] debug: redirecting (301) to from

43 2020-03-19 11:25:42 [scrapy.core.engine] debug: crawled (200) (referer: none)

44 2020-03-19 11:25:42 [demo] debug: saved file demo.html.

45 2020-03-19 11:25:42 [scrapy.core.engine] info: closing spider (finished)

46 2020-03-19 11:25:42 [scrapy.statscollectors] info: dumping scrapy stats:

47 {'downloader/request_bytes': 892,

48 'downloader/request_count': 4,

49 'downloader/request_method_count/get': 4,

50 'downloader/response_bytes': 1901,

51 'downloader/response_count': 4,

52 'downloader/response_status_count/200': 1,

53 'downloader/response_status_count/301': 2,

54 'downloader/response_status_count/404': 1,

55 'elapsed_time_seconds': 0.644698,

56 'finish_reason': 'finished',

57 'finish_time': datetime.datetime(2020, 3, 19, 3, 25, 42, 983695),

58 'log_count/debug': 5,

59 'log_count/info': 10,

60 'response_received_count': 2,

61 'robotstxt/request_count': 1,

62 'robotstxt/response_count': 1,

63 'robotstxt/response_status_count/404': 1,

64 'scheduler/dequeued': 2,

65 'scheduler/dequeued/memory': 2,

66 'scheduler/enqueued': 2,

67 'scheduler/enqueued/memory': 2,

68 'start_time': datetime.datetime(2020, 3, 19, 3, 25, 42, 338997)}

69 2020-03-19 11:25:42 [scrapy.core.engine] info: spider closed (finished)

捕获的页面存储在demo.html中

b_0_202003191417255637.jpg

五、代码理解

1、demo.py完整版代码

1 import scrapy

2

3 class demospider(scrapy.spider):

4 name = 'demo'

5

6 def start_requests(self):

7 urls = [

8 'http://python123.io/ws/demo.html'

9 ]

10 for url in urls:

11 yield scrapy.request(url = url,callback = self.parse)

12

13 def parse(self, response):

14 fname = response.url.split('/')[-1]

15 with open(fname,'wb') as f:

16 f.write(response.body)

17 self.log('saved file %s.'% fname)

start_requests(self)函数是一个生成器,当url数过多时,可以带来较好的资源占用

2、yield关键字

yield<--->生成器

生成器是一个不断产生值得函数

包含yield语句的函数是一个生成器

生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

生成器写法

1 def gen(n): #定义gen()函数

2 for i in range(n):

3 yield i**2

4

5 for i in gen(5):

6 print(i," ",end = "")

7 0 1 4 9 16

生成器相比一次列出所有内容来说,更节省存储空间、响应更迅速、使用更灵活

普通写法

1 def square(n): #定义square()函数

2 ls = [i**2 for i in range(n)]

3 return ls

4

5 for i in range(5):

6 print(i," ",end = "")

7 0 1 2 3 4

普通写法将所有结果都存入一个列表中,占用空间大且耗时,不利于程序运行

六、scrapy爬虫框架总结

1、scrapy爬虫的使用步骤

(1)创建一个工程和spider模板

(2)编写spider

(3)编写item pipeline

(4)配置策略

2、scrapy爬虫的数据类型

(1)request类

class scrapy.http.request()

request对象表示一个http请求

由spider生成,由downloader执行

属性或方法

说明

.url

request对应的请求url地址

.method

对应的请求方法,’get’’post’等

.headers

字典类型风格的请求头

.body

请求内容主体,字符串类型

.meta

用户添加的扩展信息,在scrapy内部模块间传递信息使用

.copy()

复制该请求

(2)response类

class scrapy.http.response()

response对象表示一个http响应

由downloader生成,由spider处理

属性或方法

说明

.url

response对应的url地址

.status

http状态码,默认是200

.headers

response对应的头部信息

.body

response对应的内容信息,字符串类型

.flags

一组标记

.request

产生response类型对应的request对象

.copy()

复制该响应

(3)item类

class scrapy.item.item()

item对象表示一个html页面中提取的信息内容

由spider生成,由item pipeline处理

item类型字典类型,可以按照字典类型操作

3、scrapy爬虫提取信息的方法

scrapy爬虫支持多种html信息提取方法

beautiful soup

lxml

re

xpath selector

css selector

css selector的基本使用

1 .css(‘a::attr(href)’).extract()

css selector由w3c组织维护并规范

资料来源:北京理工大学,嵩天,mooc

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值