返回介绍

13.3 Scrapy 登录网站的高级技巧

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

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。

发布评论

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