scrapy伪装浏览器及模拟登陆

本文主要讲使用scrapy框架模拟登陆。

原理

HTTP协议定义了在浏览器和Web服务器之间传输的报文格式。Web页面是由对象(HTML文件,JPEG图片)组成。用户在输入页面信息(如用户名、密码)时,浏览器向服务器发出对该页面所包含对象的HTTP请求报文,服务器认证用户信息后用相应的HTTP响应报文进行响应。因此在模拟登陆的过程中关键的两步是:

  • 伪装浏览器
  • 实现身份认证

伪装浏览器

伪装浏览器需要在scrapy请求中添加一个登陆的头部消息headers即可以让服务器认为这边请求的是一个浏览器发出的。

登陆的头部消息可以通过谷歌浏览器自带的开发者工具中network获取,具体过程见实践部分。

模拟登陆

模拟登陆的实现由两种方法:

1、使用表单进行身份识别

在http请求报文中,若方法字段为POST,报文主体中包含的就是用户在表单字段中输入的值。同样可以通过network工具获得表单的格式。其中就包含用户名和密码。

我们猜测:若能将完整的表单放在给服务器的请求中可以通过认证。但在实际中由于各网站实行的安全机制(如验证码、流水号),导致获取完整的表单较困难。

我们尝试用该办法登录知乎,csdn均失败。前者是由于表单信息中包含验证码,后者是由于表单信息中的流水号值无法提取。

2、使用cookie

cookie是在客户端记录用户身份的一段文本信息。客户端请求服务器,如果服务器需要记录用户状态,就向浏览器颁发一个cookie,浏览器就把cookie保存起来。当浏览器再次请求该网站时,浏览器就把请求的网址和cookie一同提交给服务器。服务器根据cookie来判断用户身份。

相应的,session是在服务器端记录用户身份。当客户端浏览服务器的时候,服务器就把客户信息记录在服务器。当客户端再次访问服务器时只需要从该session中查找该客户的状态就可以了。

我们只要成功登录一次将该cookie记录下来,之后该cookie放在请求中即可登录成功。

模拟登陆实践(以爬知乎为例)

伪装浏览器

先查看浏览器请求的headers,一般浏览器都可以通过F12键查看网页源码,随便填写点击登录:根据下图中所示,可查看Request Headers,选择一些重要的选项一般如代码中所示(若不成功可添加选项host等,若是别的网页,可以改变相应Referer值):

知乎的登陆界面需要伪装浏览器才会得到服务器的response,使用scrapy请求知乎登录界面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from scrapy.selector import Selector
from scrapy.http import Request
import scrapy
class LoginzhihuSpider(scrapy.Spider):
name = "weizhuang"
allowed_domains = ["www.zhihu.com"]

headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip,deflate",
"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4",
"Connection": "keep-alive",
"Content-Type":" application/x-www-form-urlencoded; charset=UTF-8",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36",
"Referer": "http://www.zhihu.com/"
}

def start_requests(self):
return [Request("https://www.zhihu.com/#signin",headers=self.headers)]

def parse(self, response):
item = Selector(response)
with open("weizhuang.html",'w') as pf:
pf.write(item.extract().encode('utf-8'))

将返回的response写入weizhuang.html文件中,使结果更清晰。

使用cookie登陆

使用cookie登录需要先登录成功,并获取登录成功后的cookie,方法与上查看headers同,只需要在上的基础上添加一个cookie,然后在Request中添加cookie参数即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from scrapy.selector import Selector
from scrapy.http import Request
import scrapy
class LoginzhihuSpider(scrapy.Spider):
name = "loginzhihu"
allowed_domains = ["www.zhihu.com"]

headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip,deflate",
"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4",
"Connection": "keep-alive",
"Content-Type":" application/x-www-form-urlencoded; charset=UTF-8",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36",
"Referer": "http://www.zhihu.com/"
}
cookies = {
'q_c1':'40e5a2577ea24044bab40cfd89928dda|1451907080000|1451907080000',
'_za':'9cc46cae-feaf-4d40-9e4c-00c635d5e971',
'_xsrf':'b291e7ad2cfebd33418165bb1c5eaf39',
'aliyungf_tc':'AQAAALW8hRQiYgAAGOVHfaTZE0xft2gk',
'__utma':'51854390.1486541705.1453623747.1453777616.1453789370.3',
'__utmb':'51854390.8.10.1453789370',
'__utmc':'51854390',
'__utmz':'51854390.1453623747.1.1.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/',
'__utmv':'51854390.000--|2=registration_date=20160121=1^3=entry_date=20160104=1',
'cap_id':'"MDI4ZDcwMzcxNTRlNDg2OGFiNWRmZTc3MGFiNmNjMjU=|1453790724|2d5c9cbb1c75291f3c654ef5501aadab83dc6a03"',
'z_c0':'"QUJBSzR0TVlXUWtYQUFBQVlRSlZUUjJqemxhVU53R0lsU0N2bDV3ZDZQWkNqYzMzWjlveXZnPT0=|1453790749|d8e7e5ecb5e4a45646e87be9a3e480ded9f41026"',
'unlock_ticket':'"QUJBSzR0TVlXUWtYQUFBQVlRSlZUU1VkcDFhU0dHdFJLYldvUnl5Z1g1aWI0QnhpNmVtM3ZnPT0=|1453790749|c3fd50b2136a13940934e9f0b94a030f270dfe64'
}
def start_requests(self):
return [Request("https://www.zhihu.com/#signin",cookies = self.cookies,headers=self.headers)]
def parse(self, response):
item = Selector(response)
with open("login.html",'w') as pf:
pf.write(item.extract().encode('utf-8'))

本例中,cookie中只要包含有z_c0这项即可达到预期效果。

  • 注意事项:

    在使用cookie模拟登陆时,必须获取登录成功的cookie,登陆成功的账号不能退出(登陆时勾上记住我可以关闭网页),每次退出都需要重新修改cookie。

文章目录
  1. 1. 原理
    1. 1.1. 伪装浏览器
    2. 1.2. 模拟登陆
  2. 2. 模拟登陆实践(以爬知乎为例)
    1. 2.1. 伪装浏览器
    2. 2.2. 使用cookie登陆