Python爬虫——9.scrapy框架get/post请求

  • Post author:
  • Post category:python





接触了这么久的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数据提交后获取的数据,这里是登录csdnpost提交登录后获取首页数据
        :param response:
        :return:
        '''
        with open('csdn.html','w') as f:
            f.write(response.body)




版权声明:本文为liyahui_3163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。