13.2 使用 FormRequest 向网站提交数据
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 爬虫的编写。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论