13.1 Cookies 登录网站的高级技巧
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,这样编写起来相对简单,也不会影响抓取效率。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论