搜狗微信公众号文章搜索的反爬处理

问题背景

搜狗搜索提供了一个微信公账号文章搜索的功能,之前看过崔庆才老师的教程(使用代理池通过代理访问),今天自己尝试了一下

分析页面

  1. 进入搜狗微信搜索,查询关键字,显示信息如下:
    Image 5.png

    打开控制台,通过观察请求的url,可以总结出如下关键信息https://weixin.sogou.com/weixin?query=%E7%8B%97&type=2&page=2:链接中query后跟查询关键字,page表示页数。有了这个url,就可以通过requests,使用代码访问了。
  2. 接下来分析页面的文档结构
    Image 7.png
    文章信息通过ul->li的形式展示,每一个li标签中的
    包含了文章的标题信息。

代码

def get_article_title(url):
    resp = requests.get(url)
    if resp.status_code == 200:
        # print(resp.text)
        info = resp.text.replace('\n', '').replace('\r', '')
        soup = BeautifulSoup(info, 'lxml')
        soup.prettify()
        ul = soup.find('ul', class_='news-list')
        for li in ul.contents:
            if isinstance(li, Tag):
                title = li.find('div', class_='txt-box').contents[0].get_text()
                print(title)
    else:
        print(resp.status_code)


base_url = 'https://weixin.sogou.com/weixin?query=%E7%8B%97&type=2&page={}'

for i in range(1, 11):
    url = base_url.format(i)
    print(url)
    get_article_title(url)

运行代码,打印了url和解析的文章名称,如下:

狗年不苟测天命 188现金红包领回家
出国前把狗给父母养,半年后回来,忍不住失声大哭!
狗,下次遛你那有“狂犬病”的主人时,记得要栓绳好吗?
狗朋友:国庆节后,要“发了”,天上掉馅饼的“功德”被你摊上了,快来接!
狗眼看人低的女人,傻眼了吧
狗眼看人低的女人,傻眼了吧!
医高一尺,狗高一丈,是真正的高手没错了!
10月1日生肖运势_猪、马、狗大吉
10月1日生肖运势_猪、马、狗大吉
“狗,请拴好你家网红”
https://weixin.sogou.com/weixin?query=%E7%8B%97&type=2&page=10

但是,如果多运行几次会发现报错:

Traceback (most recent call last):
  File "D:/pythonSpace/lear_scrapy/test/t1.py", line 45, in 
    get_article_title(url)
  File "D:/pythonSpace/lear_scrapy/test/t1.py", line 31, in get_article_title
    for li in ul.contents:
AttributeError: 'NoneType' object has no attribute 'contents'

异常信息很明显,上述代码没有按我希望的解析出ul,ul是None,但是之前是明明可以运行的。然后我尝试将请求返回的网页信息打印出来,部分结果如下:

IP�1.49.13.70
访����2018.10.01 00:18:33

���好���访������为确认�次访�为正常���为���������

这段乱码的东西,我放在notepad++里面更改了多种文件编码也没有正确的显示文字信息,不过上面第一个P标签处能看到IP字样,所以我单纯地猜测是因为访问速度过去,我的IP被封住了,为了验证我的猜想,我打开浏览器访问了刚刚的页面,但是结果很奇葩,浏览器可以正常访问!如果IP被封,我的浏览器应该也不能访问才对啊?中间我尝试增加headers,使用代理,但是还是无法正常访问,搞了好久。最后只能说:这东西要是有爬虫经验,应该一早能想到!除了headers和代理,还有一个最重要的,Cookie!!!于是我在浏览器上查看了页面的cookie,有下面的那么多东西。不管了,先把cookie清一下

Image 8.png

好了,清理了cookie以后,刷新出现了下面的页面:
Image 9.png

果然是IP被禁了!但是很奇怪的是,上面这个1.49.13.70根本不是我的IP啊。这其中搜狗搜索做了什么处理我也没想清楚,留着后面看看能不能Google到吧。先输入验证码,保证浏览器可以正常访问。然后我把weixin.sougou.com这个域下的cookie填到代码中再进行访问。发现代码可以正确运行:

https://weixin.sogou.com/weixin?query=%E7%8B%97&type=2&page=10
龚伟:老人与狗|聆听青山
“狗,请拴好你家网红”
主人训练狗子吃饭,马犬忍不住喷出口水泡泡,狗:我顶不住了……
在农村,为什么狗有时候会叫一晚上?农民说出实情,原因想不到!
生肖马,狗年过半!下半年仍需“注意”,小心祸不单行!
“你家的3条狗咬死了我家75只鸡”“你的鸡没办手续”
为发横财,去村里偷狗,十三年后,落得瘫痪乞讨无人管
搞笑图片:活的不如狗系列!
这款脏脏狗蛋糕,因做得太逼真!胆小点的都不敢吃!
“实拍”踹了狗一下竟然叫一群狗砸车

不过最后发现,如果访问频率过快,还是会出现上面的问题。我测试访问一个页面停止2秒没有问题。但是我用代理以后如果不添加cookie,还是会出现上面的错误,而且IP还是那个1.49.13.70。这个坑先记着吧

你可能感兴趣的:(搜狗微信公众号文章搜索的反爬处理)