在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了。

 
 
 
 
 
Python
 
1
zhihu

使用以上命令生成知乎爬虫,代码如下:

 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
# -*- coding: utf-8 -*-
scrapy
 
 
:
'zhihu'
]
]
 
:
pass

有一点切记,不要忘了启用 Cookies切记切记 :

 
 
 
 
 
Python
 
1
2
# Disable cookies (enabled by default)
True

 

模拟登陆

过程如下:

  • 进入登录页,获取 Header 和 Cookie 信息

完善的 Header 信息能尽量伪装爬虫, 有效 Cookie 信息能迷惑知乎服务端,使其认为当前登录非首次登录,若无有效 Cookie 会遭遇验证码。 在抓取数据之前,请在浏览器中登录过知乎,这样才使得 Cookie 是有效的。

Scrapy 模拟登陆知乎--抓取热点话题

Header 和 Cookie 整理如下:

 
 
 
 
 
 
Python
 
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
37
38
39
40
41
42
43
44
45
46
47
{
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
}
 
{
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
:
,
}

 

  • 在浏览器中,模拟登陆,抓取登陆请求信息。

Scrapy 模拟登陆知乎--抓取热点话题

从图中可以看到 _xsrf 参数, 这个参数与登陆验证信息无关,但很明显是由登陆页面携带的信息。 Google了下 xsrf 的含义, 用于防范 跨站请求伪造 。

Scrapy 模拟登陆知乎--抓取热点话题

  • 整理以上,代码如下:
     
     
     
     
     
    Python
     
    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
    'https://www.zhihu.com/#signin'
    'https://www.zhihu.com/login/email'
     
     
    :
    [
    (
    ,
    ,
    ,
    ,
    )
    ]
     
     
    :
    (
    'div.view-signin > form > input[name=_xsrf]::attr(value)'
    )
    xsrf
     
    [
    (
    ,
    ,
    ,
    ,
    {
    ,
    ,
    ,
    ,
    ,
    )
    ]

设置Bearer Token

经过上述步骤登陆成功了,有点小激动,有没有! 但苦难到此还远没有结束,这个时候尝试抓取最近热门话题,直接返回 code:401 ,未授权的访问。 授权信息未设置,导致了此类错误,莫非遗漏了什么,看来只能在浏览器中追踪请求参数来侦测问题。 在浏览器的请求中,包含了Bearer Token, 而我在scrapy中模拟的请求中未包含此信息, 所以我被服务器认定为未授权的。 通过观察发现 Bearer Token 的关键部分,就是 Cookies 中的 z_c0 包含的信息。

Scrapy 模拟登陆知乎--抓取热点话题
z_c0 包含的信息,是在登陆完成时种下的,所以从登陆完成返回的登陆信息里,获取要设置的 Cookie 信息, 然后拼接出 Bearer Token,最后设置到 Header 中。

代码整理如下:

 
 
 
 
 
 
Python
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
:
)
)
:
(
]
z_c0
(
,
,
,
,
{
,
,
,
,
'true'
,
)
:
)

 

获取数据

上述步骤后,数据获取就水到渠成了,为了检测成功与否, 把返回信息写到文件中,而且只获取前五十个,代码如下:

 
 
 
 
 
Python
 
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
'https://www.zhihu.com/api/v3/feed/topstory'
''
0
 
 
:
:
)
)
]
:
]
entry
 
]
)
:
]
)
 
 
:
(
,
,
,
,
)

最终获取的数据如下图所示:

Scrapy 模拟登陆知乎--抓取热点话题

写在最后

知乎的数据,只有登录完成之后,才可有效的获取,所以模拟登陆是无法忽略不管的。 所谓的模拟登陆,只是在scrapy中尽量的模拟在浏览器中的交互过程,使服务端无感抓包过程。 请求中附加有效的 Cookies 和 Headers 头信息,可有效的迷惑服务端, 同时在交互的过程中,获取后续请求必要信息和认证信息,使得整个流程能不断先前。

相关文章:

  • 2022-12-23
  • 2021-11-29
  • 2021-10-10
  • 2021-09-30
  • 2022-12-23
  • 2021-08-07
  • 2021-09-21
  • 2021-07-05
猜你喜欢
  • 2021-09-01
  • 2021-12-06
  • 2021-07-29
  • 2021-06-04
  • 2021-09-24
  • 2022-12-23
  • 2021-12-30
相关资源
相似解决方案