使用IP代理反而爬取不了数据的问题

来源:8-6 scrapy实现ip代理池 - 1

慕粉3883702

2021-07-10

bobby老师,您好,我在使用IP代理的时候遇到一些问题。

简述:
不使用代理的时候,可以少量爬取boss直聘的数据。

使用了代理之后,无法爬取boss直聘的数据,一条也不行,先后试了阿布云和小象代理,都是如此。

尝试接入代理之后爬取知乎热榜数据,有返回结果,证明代理的接入是没有问题的。

那么问题出在哪儿呢?

附一些截图:
(1)代理的设置:
图片描述

(2)尝试是否可以更换IP:
图片描述

(3)用代理爬取知乎热榜
证明代理是没有问题的
图片描述
图片描述
(4)用代理爬取boss直聘,只会出现如下的乱码:
图片描述

(5)不接代理,只添加user-agent和cookie,反而能获取到结果(但是速度较慢)
图片描述
图片描述
这是怎么回事呢……卡在这个地方好久了……

追加编辑,贴上代码:

“”"
(1) 不使用代理爬取boss直聘
"""

import requests
url = "https://www.zhipin.com/job_detail/846aab1aa2dbcd491nRy3dm_F1dR.html"
# 这里是直接【F12】从浏览器复制粘贴的cookie
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
           'cookie':'(太长了,删去)'}
res = requests.get(url=url,headers=headers)

print(res.status_code)
print(res.text)

“”"
(2) 使用代理爬取知乎热榜
"""

import requests

# 目标页面(知乎热榜)
targetUrl = "https://www.zhihu.com/hot"

# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"

# 代理隧道验证信息(通行证书和通行密钥)
proxyUser = "H4D601377P1V052D"
proxyPass = "93A1F9B59F94D644"

proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
  "host" : proxyHost,
  "port" : proxyPort,
  "user" : proxyUser,
  "pass" : proxyPass,
}

proxies = {
    "http"  : proxyMeta,
    "https" : proxyMeta,
}


# 同样,直接【F12】复制cookie
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
           'cookie':'(太长,略去)'}

resp = requests.get(url=targetUrl,headers=headers,proxies=proxies)

print(resp.status_code)
print(resp.text)     

“”"
(3) 使用代理爬取boss直聘
"""

import requests

# 目标页面
url = "https://www.zhipin.com/job_detail/846aab1aa2dbcd491nRy3dm_F1dR.html"

# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"

# 代理隧道验证信息
proxyUser = "H4D601377P1V052D"
proxyPass = "93A1F9B59F94D644"

proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
  "host" : proxyHost,
  "port" : proxyPort,
  "user" : proxyUser,
  "pass" : proxyPass,
}

proxies = {
    "http"  : proxyMeta,
    "https" : proxyMeta,
}


# 同样,直接【F12】复制cookie
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
           'cookie':'(略)'}

resp = requests.get(url=targetUrl,headers=headers,proxies=proxies,verify=False)

print(resp.status_code)
print(resp.text)

(就是这以上三个)

注:阿布云的密钥是可用的:
图片描述

写回答

2回答

bobby

2021-07-16

试过了,boss直聘采取了动态cookie,也就是cookie用过一段时间会失效,所以boss直聘采取的策略是:

     1. 必须获取到cookie才能访问,这个可以通过selenim去获取,也可以通过逆向去分析(成本较大) 

     2. 将cookie和ip绑定。这样即使你拿到cookie想去切换ip也不行。这种情况你需要买阿布云的固定ip,而不是每次请求都不一样的ip

所以综合起来就是:

    1. 通过阿布云去购买固定的ip

    2. 让后通过selenium加上这个固定的ip代理去获取可用的cookie

    3. 然后将这个可用的cookie+requests+刚才selenium请求的ip 去模拟获取

    4. 这种cookie失效也比较快。所以需要你频繁的去使用selenium分析出cookie

    5. 为了方便你可以逆向cookie的生成规则,不过这种方法很容易失效,好像boss直聘改这种规则还挺频繁的

爬虫不易,加油


0
1
慕粉3883702
谢谢老师,我终于有思路了
2021-07-18
共1条回复

bobby

2021-07-12

这个问题有点意思,你把你的不使用代理的源码和使用阿布云的代理的源码都贴一下,我在本地测试运行试试

0
1
慕粉3883702
好的,老师。 scrapy的代码太多太乱了,我就用requests写了,结果都是一样的。代码贴在原帖的下面,我重新编辑了, 麻烦老师了。
2021-07-16
共1条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5796 学习 · 6290 问题

查看课程