未加星标

Scrapy定向爬虫教程(五)――保持登陆状态

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

在访问网站的时候,我们经常遇到有些页面必须用户登录才能访问。这个时候我们之前写的傻傻的爬虫就被ban在门外了。所以本节,我们给爬虫配置cookie,使得爬虫能保持用户已登录的状态,达到获得那些需登录才能访问的页面的目的。

由于本节只是单纯的想保持一下登陆状态,所以就不写复杂的获取页面了,还是像本教程的第一部分一样,下载个网站主页验证一下就ok了。本节 github戳此处 。

原理

一般情况下,网站通过存放在客户端的一个被称作cookie的小文件来存放用户的登陆信息。在浏览器访问网站的时候,会把这个小文件发往服务器,然后服务器根据这个小文件确定你的身份,然后返回给你特定的信息。

我们要做的就是尽量模拟浏览器的行为,在使用爬虫访问网站时也带上cookie来访问。

前提

前提当然是你有个账号了,目前本教程一直使用的论坛 心韵论坛 是我本人搭建的,已经被各种爬虫发的广告水的不要不要的了,为了本教程,仍然是开放注册并一直开着服。但不保证会一直开着,不过根据本教程的讲解,爬取别的Discuz框架论坛一般是没问题的。扯远了……

获取cookie

按照以下步骤操作

登陆论坛,进入主页 按F12进入Chrome或Firefox的开发者调试工具,选择Network选项卡 按F5刷新一下页面 选择Doc子选项卡 找到主页的请求和返回情况 找到Request Headers 复制出cookie

如图:


Scrapy定向爬虫教程(五)――保持登陆状态
把cookie转化格式

在scrapy中,设置cookie需要是字典格式的,可是我们从浏览器Copy出来的是字符串格式的,所以我们需要写个小程序来转化一下

transCookie.py

# -*- coding: utf-8 -*-
class transCookie:
def __init__(self, cookie):
self.cookie = cookie
def stringToDict(self):
'''
将从浏览器上Copy来的cookie字符串转化为Scrapy能使用的Dict
:return:
'''
itemDict = {}
items = self.cookie.split(';')
for item in items:key = item.split('=')[0].replace(' ', '')value = item.split('=')[1]itemDict[key] = value
return itemDict
if __name__ == "__main__":
cookie = "你复制出的cookie"
trans = transCookie(cookie)
print trans.stringToDict()

运行的效果如图


Scrapy定向爬虫教程(五)――保持登陆状态

然后把这个字典复制出来。

给scrapy配置cookie

首先把刚才得到的cookie放到 settings.py 里

settings.py

# -*- coding: utf-8 -*-
BOT_NAME = 'heartsong'
SPIDER_MODULES = ['heartsong.spiders']
NEWSPIDER_MODULE = 'heartsong.spiders'
ROBOTSTXT_OBEY = False # 不遵守Robot协议
# 使用transCookie.py翻译出的Cookie字典
COOKIE = {'key1': 'value1', 'key2': 'value2'}

然后编写爬虫文件

heartsong_spider.py

# -*- coding: utf-8 -*-
# import scrapy # 可以用这句代替下面三句,但不推荐
from scrapy.spiders import Spider
from scrapy import Request
from scrapy.conf import settings
class HeartsongSpider(Spider):
name = "heartsong"
allowed_domains = ["heartsong.top"] # 允许爬取的域名,非此域名的网页不会爬取
start_urls = [
# 主页,此例只下载主页,看是否有登录信息
"http://www.heartsong.top/forum.php"
]
cookie = settings['COOKIE'] # 带着Cookie向网页发请求
# 发送给服务器的http头信息,有的网站需要伪装出浏览器头进行爬取,有的则不需要
headers = {
'Connection': 'keep - alive', # 保持链接状态
'User-Agent': 'Mozilla/5.0 (X11; linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
}
# 对请求的返回进行处理的配置
meta = {
'dont_redirect': True, # 禁止网页重定向
'handle_httpstatus_list': [301, 302] # 对哪些异常返回进行处理
}
# 爬虫的起点
def start_requests(self):
# 带着cookie向网站服务器发请求,表明我们是一个已登录的用户
yield Request(self.start_urls[0], callback=self.parse, cookies=self.cookie, headers=self.headers, meta=self.meta)
# Request请求的默认回调函数
def parse(self, response):
with open("check.html", "wb") as f:f.write(response.body) # 把下载的网页存入文件

总的来说一句话,就是带着cookie发起Request请求。

运行之后会将主页保存,我们打开文件查看一下效果


Scrapy定向爬虫教程(五)――保持登陆状态
小结

本节介绍了cookie的获取方法和如何给scrapy设置cookie,下节我会介绍如果带着登陆状态去回复主题帖。

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: 浏览器服务器ChromeLinux广告AppleHTMLDUFirefoxHead
分页:12
转载请注明
本文标题:Scrapy定向爬虫教程(五)――保持登陆状态
本站链接:http://www.codesec.net/view/483318.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(43)