接触了这么久的scrapy框架,你是否会疑惑,在scrapy底层,代码到底是怎么运行的呢?
原来由一个起始url,通过scrapy.Request()函数会默认封装为一个get请求对象,该对象触发找到引擎模块scrapy.engine,引擎模块指向调度模块scrapy.schedule,调度模块接收到后对start_urls列表进行有序排列,然后将信息返回给引擎,引擎转而启动下载模块进行数据的采集,采集好的数据会直接传给爬虫程序中的parse函数进行数据处理。scrapy框架默认为get请求,若要发起post请求,则需要研究start_request()函数,该函数返回的是请求对象,若重新返回,则可以自定义post请求对象,如下
# coding:utf-8
'''
关于scrapy框架的底层代码的了解
'''
import scrapy
class GetSpider(scrapy.Spider):
name='getspider'
allowed_domains=['baidu.com']
start_urls=['http://www.baidu.com']
def parse(self,response):
'''
请求的数据采集工作,有scrapy框架自动完成
爬虫【起始地址列表start_urls】->由scrapy.Request()封装为请求对象
->scrapy.enging引擎对象
->scrapy.schedule 调度模块
->scrapy.download下载模块
->scrapy.engine引擎模块
->爬虫程序得到数据
->爬虫【parse函数】进行后续的数据处理
->请求的操作,不能由爬虫程序控制,而是scaapy自动调度,发送了get请求
:param response:
:return:
'''
pass
class PostSpider(scrapy.Spider):
name='postspider'
allowed_domains=['csdn.net']
start_urls=['https://www.csdn.net/']
# 重写start_request函数
def start_requests(self):
'''
重写start_requests函数,发送自定义请求
:return:
return scrapy.Request(self.start_urls[0],method='POST
'''
# FormRequest是专门用来发送post请求的函数
return scrapy.FormRequest(
self.start_urls[0],
# formdata为字典,
formdata={'username':'admin','password':'123'},
# 重写了start_requests函数,记得以一定要重定义callback函数,使其指向parse,进行数据处理
callback=self.parse
)
def parse(self,response):
'''
这个函数中,专门用来处理post请求得到的响应数据
:param response:
:return:
'''
pass
下面展示一个scrapy框架发送post请求获取数据的实例:登录csdn后获取首页数据,这里要注意流水号的获取。
# coding:utf-8 ''' 使用scrapy框架,提交post请求,以登录csdn为例 ''' # 引入需要得模块 import scrapy # 定义爬虫程序类型 class CsdnSpider(scrapy.Spider): # 定义爬虫程序的名称,用于在命令行启动程序时使用 name='csdn' # 定义爬虫的限制域 allowed_domains=['csdn.net'] # 定义起始url start_urls=['https://passport.csdn.net/account/login'] def parse(self,response): ''' 重写start_requests方法,自定义请求对象 :return: ''' # 获取csdn登录流水号 lt=response.xpath("//input[@name='lt']/@value").extract()[0] return scrapy.FormRequest.from_response( response, self.start_urls[0], # 填写post提交数据,以字典的形式,k值由网页中的对应id/name属性名称决定,v值是自己的登录信息 formdata={'username':'admin','password':'123','lt':lt}, callback=self.parse_response ) def parse_response(self, response): ''' 数据处理函数,用于接收post数据提交后获取的数据,这里是登录csdn,post提交登录后获取首页数据 :param response: :return: ''' with open('csdn.html','w') as f: f.write(response.body)
版权声明:本文为liyahui_3163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。