返回介绍

13.2 使用 FormRequest 向网站提交数据

发布于 2025-04-21 19:15:30 字数 2515 浏览 0 评论 0 收藏

13.2.1 FormRequest 类

Scrapy 提供的 FormRequest 类是在 scrapy.Request 类的基础上为爬取过程中处理 HTML 表单做了一些扩展。FormRequest 在 Request 所有参数的基础上添加一个新的参数 - formdata,这个参数允许用户以字典的形式向网站提交数据,在遇到需要向网站提交数据才能爬取的情况时,可以使用 FormRequest 代替 Request 发起请求并提交数据。

FormRequest 还提供了一个非常重要的类方法 FormRequest.from_response() 方法,主要应用在模拟登录等场景,13.3 节将演示其用法。

下面以爬取 Q 房网二手房房源数据为例,讲解使用 FormRequest 向网站提交数据的方法。

13.2.2 爬取 Q 房网二手房房源

实战-向网站提交数据-爬取 Q 房网

不同于第 4 章中使用 Requests 爬取 Q 房网 Web 页面,这一次使用 Scrapy 爬取 Q 房网的移动页面。

1. 网站分析

打开深圳 Q 房网移动页面(http://m.qfang.com/shenzhen/sale?insource=index),不难发现这是一个动态页面,当翻到页面底部时,它会动态加载新的房源信息。使用 Chrome 浏览器的检查功能会发现它实际请求的网址为 http://m.qfang.com/shenzhen/sale?insource=index&page=X。

这里的 X 代表页码。如果直接请求这些网址,并不能爬取到房源信息,这是为什么呢?下面分析它的请求过程。

在请求某一页的时候,如第 4 页(见图 13-1),系统同时向网站提交 more:4 的信息,这样才能获取到对应页码的房源数据。现在知道了 Q 房网移动网站的特点,下面直接演示 spider 文件的编写。

图 13-1 Q 房网请求分析

2. spider 代码实现

这里主要爬取房源的标题和价格。新建一个爬虫项目 Pachong4,编写 Item 文件。

import scrapy
 
class Pachong4Item(scrapy.Item): 
    title = scrapy.Field() 
price = scrapy.Field() 

重点看 spider 文件,因为从第一页开始就需要提交数据,所以重写 start_requests 方法。

import scrapy
from pachong4.items import Pachong4Item 
 
class QfangSpider(scrapy.Spider): 
   name = 'qfang' 
    def start_requests(self): 
        #设置 URL 前面部分 
        url_pre = 'http://m.qfang.com/shenzhen/sale?version=a&page='  
        for i in range(1,6): 
            url = url_pre + str(i)  #构造 URL 
            formdata = {'more':str(i)} 
            yield scrapy.FormRequest(url, formdata=formdata,  
                                     callback=self.parse)

这里爬取前 5 页,使用一个循环构造爬取的 URL 和提交的 formdata 字典,最后使用 scrapy.FormRequest 提交请求及 formdata 数据,并设置回调函数为 parse 方法。

def parse(self, response):
    #先从房源列表中取出每一段的代码 
        house_list = response.xpath('//a')  
    for house in house_list: 
        item = Pachong4Item() 
        item['title'] = house.xpath('div[2]/p[1]/text()').extract()[0] 
        item['price'] = house.xpath('div[2]/p[3]/em/text()').extract()[0] 
yield item 

需要特别注意,parse 方法提取房源列表代码段时,xpath 路径是 '//a',也就是直接从根目录提取 a 节点元素,这是因为请求分页 URL 返回的直接就是房源列表的 HTML 代码,没有一般页面中前面的一系列的元素,因此直接从根目录取 a 元素就得到了房源码段列表。

第 4 章演示过使用 Requests 爬取 Q 房网二手房房源数据,读者可以与本节的方法比较学习,重点要学会需要向网站提交数据情况下的 Scrapy 爬虫的编写。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。