返回介绍

13.1 Cookies 登录网站的高级技巧

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

13.1.1 Request 对象

下面再了解一下 Scrapy 的 Request 对象。Scrapy 使用 Request 来执行请求并返回响应对象。Request 常用参数如下。

(1)URL:也就是请求网址。

(2)callback:执行解析响应对象的函数。通过这个参数指定由哪个解析函数来解析请求返回的响应。

(3)method:指定 HTTP 请求类型,默认是 GET,当需要向网站提交数据的时候,可以使用 POST。

(4)headers:可以使用这个参数指定请求的头部信息,包括用户代理信息等。请注意,这里设置的优先级要高于 settings.py 中默认的 headers,也就是说,如果这里设置了 headers,Request 就不会使用默认设置的 headers。

(5)Cookies:这个参数允许使用字典或者字典的列表设置请求的 Cookies。一般来说,Scrapy 默认会帮用户处理 Cookies 信息,当需要设置为某个保存的 Cookies 时,可以在这里指定 Cookies。

(6)dont_filter:这个参数需要设置为布尔值,它用来设置是否允许 Scrapy 的队列对 Request 的 URL 进行重复过滤,默认是 False,也就是对 URL 执行过滤。如果需要打开它,要防止进入抓取死循环。

(7)meta:这个参数可以传递信息,例如前面曾经使用这个参数在请求之间传递数据,另外这个参数还可以设置一些其他额外的信息,如不希望 Scrapy 在请求后合并 Cookies,可以编写如下代码进行设置。

meta = {'dont_merge_cookies': True} 

上面这几个参数是 Request 比较常用的参数。如果要抓取需要登录后才能查看的网站信息,一个相对简单的办法就是使用 Cookies 参数,利用网站的保持登录机制,给它设置一个登录后的 Cookies 信息,从而实现对网站深层页面的抓取。

13.1.2 利用 Cookies 登录网站的技巧

使用 Cookies 登录豆瓣

通过第 5 章的学习,读者应当知道可以利用网站的保持登录机制,使用 Cookies 登录网站,从而抓取网站的深层网页。这就需要首先获得一个已经登录的 Cookies,有 3 种方式获得登录后的 Cookies。

(1)在浏览器中登录,然后把浏览器保持登录的 Cookies 复制下来。

(2)使用 requests 登录网站,然后在返回的 response 中取出登录后的 response.cookies。

(3)使用 selenium 和 Chrome 浏览器登录网站,然后使用 driver.get_cookies() 方法获得已登录的 Cookies 信息。

为了简单,这里用第一种方式获取了登录豆瓣网站后的 Cookies,现在使用 Scrapy 登录豆瓣网站并爬取登录后的个人网页。相信通过前面的学习,读者对建立项目、设置 Item 等已经很熟悉了,这里着重看一下 spider 爬虫文件的编写。

首先设置 Cookies 和 headers 等信息。设置 headers 的目的是防止被豆瓣网站反爬虫禁止。

import Scrapy
 
class DoubanSpider(Scrapy.Spider): 
    name = 'douban' 
    allowed_domains = ['douban.com'] 
    start_urls = ['https://www.douban.com/'] 
 
    cookies={ 
        'bid': 'IuQLRu42FKE',  
        'gr_user_id': '9563059c-64f9-4413-a8b3-f6c144442b42',  
        'viewed': '"25779298"',  
        '_vwo_uuid_v2': 'D7C73030E63DF3C30B31714EB4496355| \ 
                         f443469b5e7c28f8ce13c507916aeef3',  
        '__yadk_uid': 'AFSBtXDmqbS1ROjSeRV5zgsdPhTDph6s',  
        'dbcl2': '"165023527:kJciabNmBqI"',  
        '__utma': '30149280.1809447340.1503671275.1511594467.1511597456.11', 
        '__utmb': '30149280.8.10.1511597456',  
headers = { 
   'Accept':'text/html,application/xhtml+xml,application/xml; \ 
                 q=0.9,image/webp,image/apng,*/*;q=0.8',  
   'Accept-Encoding':'gzip, deflate, br', 
   'Accept-Language':'zh-CN,zh;q=0.9', 
   'Cache-Control':'max-age=0', 
   'Connection':'keep-alive', 
   'Host':'www.douban.com', 
   'Upgrade-Insecure-Requests':'1', 
   'Referer':'https://www.douban.com/', 
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) \ 
                 AppleWebKit/537.36 (KHTML, like Gecko) \ 
Chrome/62.0.3202.89 Safari/537.36'} 

由于需要爬取登录后的豆瓣网站,必须重写 start_requests 方法,从而实现对豆瓣网站个人页面的登录爬取。

    def start_requests(self):
        my_url = 'https://www.douban.com/people/xpython/' 
        yield scrapy.Request(my_url, Cookies=self.cookies,  
                             headers=self.headers, callback=self.parse)

上面的代码使用 scrapy.Request 请求个人主页网址,添加了 Cookies 和 headers 信息,并设置了 parse 为回调函数。下面编写 parse 方法,验证是否已经登录。

    def parse(self, response):
        name = response.xpath( 
          '//*[@id="db-usr-profile"]/div[1]/a/img/@alt').extract_first() 
        print(name) 
        url_home='https://www.douban.com/' 
        yield scrapy.Request(url_home, cookies=self.cookies,  
headers=self.headers, callback=self.parse_home) 

parse 回调函数解析并打印出了个人主页的名字。为了再次确认已经登录,继续使用 Cookies 请求豆瓣网站的首页,并设置 parse_shouye 为回调函数。

    def parse_home(self, response):
        author = response.xpath( 
          '//*[@id="statuses"]/div[2]/div[1]/div/div/div[1]/div[2]/a/text()' 
                              ).extract_first() 
print(author) 

这里解析出了第一条动态信息的作者并打印出来,读者可以与浏览器中看到的结果对比一下。

上面简单介绍了 Scrapy 的 Request 对象并演示了使用 Cookies 登录豆瓣网站。在实际的项目中,可以使用 Selenium 登录网站并获取登录后的 Cookies,这样编写起来相对简单,也不会影响抓取效率。

发布评论

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