副问题[/!--empirenews.page--]
有立场地进修
之前讲了署理池以及Cookies的相干常识,这里针对搜狗搜刮微信公家号文章的爬取,将它俩实践一下。
在崔大的书内里,他是用署理IP来应对搜狗的反爬法子,由于统一IP会见网页过于频仍,就会跳转验证码页面。
不外期间在前进,搜狗搜刮的反爬也在更新,此刻它是IP加Cookies双重把关。
01 网页说明

获取微信公家号文章信息,问题、开头、公家号、宣布时刻。
哀求方法为GET,哀求网址为红框部门,后头的信息没什么用。
02 反爬破解

什么时辰呈现上图这种环境呢?
两种,一种统一个IP一再见见页面,另一种统一个Cookies一再见见页面。
两个都有,挂的更快!完备爬取我只乐成了一次...
由于我最开始就是先什么都不配置,然后就呈现验证码页面。然后用了署理IP,照旧会跳转验证码页面,直到最后改变Cookies,才乐成爬取。
01 署理IP配置
- def get_proxies(i):
- """
- 获取署理IP
- """
- df = pd.read_csv('sg_effective_ip.csv', header=None, names=["proxy_type", "proxy_url"])
- proxy_type = ["{}".format(i) for i in np.array(df['proxy_type'])]
- proxy_url = ["{}".format(i) for i in np.array(df['proxy_url'])]
- proxies = {proxy_type[i]: proxy_url[i]}
- return proxies
署理的获取以及行使这里就不赘述了,前面的文章有提到,有乐趣的小搭档可以自行去看看。
颠末我两天的实践,免费IP确实没什么用,两下子就把我真实IP揪出来了。
02 Cookies配置
- def get_cookies_snuid():
- """
- 获取SNUID值
- """
- time.sleep(float(random.randint(2, 5)))
- url = "http://weixin.sogou.com/weixin?type=2&s_from=input&query=python&ie=utf8&_sug_=n&_sug_type_="
- headers = {"Cookie": "ABTEST=你的参数;IPLOC=CN3301;SUID=你的参数;SUIR=你的参数"}
- # HEAD哀求,哀求资源的首部
- response = requests.head(url, headers=headers).headers
- result = re.findall('SNUID=(.*?); expires', response['Set-Cookie'])
- SNUID = result[0]
- return SNUID
总的来说,Cookies的配置是整个反爬中最重要的,而个中的要害即是动态改变SNUID值。
这里就不具体说个中缘由,事实我也是在网上看大神的帖子才贯通到的,并且贯通的还很浅。
乐成爬取100页就只有一次,75页,50页,乃至到最后一爬就挂的环境都呈现了...
我可不想身陷「爬-反爬-反反爬」的泥潭之中,爬虫之后的工作才是我的真正目标,好比数据说明,数据可视化。
以是干票大的赶忙溜,只能跪拜搜狗工程师。
03 数据获取
1 结构哀求头
- head = """
- Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- Accept-Encoding:gzip, deflate
- Accept-Language:zh-CN,zh;q=0.9
- Connection:keep-alive
- Host:weixin.sogou.com
- Referer:'http://weixin.sogou.com/',
- Upgrade-Insecure-Requests:1
- User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
- """
-
- # 不包括SNUID值
- cookie = '你的Cookies'
-
- def str_to_dict(header):
- """
- 结构哀求头,可以在差异函数里结构差异的哀求头
- """
- header_dict = {}
- header = header.split('n')
- for h in header:
- h = h.strip()
- if h:
- k, v = h.split(':', 1)
- header_dict[k] = v.strip()
- return header_dict
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|