副标题[/!--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
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|