13.3 Scrapy 登录网站的高级技巧
13.3.1 FormRequest.from_response() 方法
13.2 节曾提到 FormRequest 还提供了一个非常重要的类方法 FormRequest.from_response() 方法,这个方法经常用于模拟用户登录。
通常网站通过<input type="hidden">实现对某些表单字段(如数据或是登录界面中的认证令牌等)的预填充。使用 Scrapy 抓取网页时,如果想要预填充或重写用户名、用户密码这些表单字段,可以使用 FormRequest.from_response() 方法实现。
下面用登录豆瓣网站来演示 FormRequest.from_response() 的用法。
13.3.2 利用 Scrapy 登录网站的技巧
豆瓣网站的登录分析在第 5 章中已经详细阐述过,这里主要写 spider 文件。
首先,把 start_urls 设置为豆瓣网站的登录页面 https://www.douban.com/accounts/login。
其次,使用 scrapy.FormRequest.from_response() 这个方法登录。这个方法的特别之处在于它的第一个参数是我们请求返回的 response,并使用 formdata 参数提交需要 POST 的数据,如用户名、密码等,这里设置 after_login 作为回调函数。
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['douban.com']
start_urls = ['https://www.douban.com/accounts/login']
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'source':'index_nav','form_email':'984595060@qq.com',
'form_password':'963852741'},
callback=self.after_login) 为了验证是否已经登录成功,可以在 after_login 方法中解析并打印首页第一条动态信息的作者,也可以把收到的响应内容(response)保存下来,与在浏览器中登录后打开的豆瓣网站首页对比,可以发现已经成功登录了豆瓣网站。
def after_login(self, response):
author = response.xpath(
'//*[@id="statuses"]/div[2]/div[1]/div/div/div[1]/div[2]/a/text()'
).extract_first()
print(author) #打印第一条动态信息的作者
with open('douban.txt', 'wb') as f:
f.write(response.body) #保存源码
return 代码中的 response.body 就是获取到的页面二进制源码,它与 Requests 中响应的 response.content 类似。
再次,设置 settings.py 文件。一是设置 ROBOTSTXT_OBEY = False。二是设置默认的 User Agent。豆瓣这个网站如果不设置 User Agent,肯定会爬取失败。
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/46.0.2490.80 Safari/537.36' 最后,运行这个爬虫,可以在 debug 信息中看到打印出的第一条动态信息的作者名,还可以查看生成的 douban.txt 文件,会发现已经成功登录了豆瓣网站。
这里并没有像 Requests 登录网站时那样使用会话对象保存 Cookies,这是因为 Scrapy 可以自动处理 Cookies,就像浏览器那样,一般情况下不需要手动保存已经登录的 Cookies。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论