反爬虫微信文章(总结)

在爬虫时,某些网站会有封ip的现象,所以选择利用代理伪装我们的ip进行爬虫请求,但进行爬虫时可能需要很多ip,这时就要求维护一个代理池(池也就是代理队列),可放进代理,也可取出代理。

本文中选择的崔庆才老师维护的代理池,是用Flask和Redis维护的一个代理池。设计的基本思路

  • 从各大网站获取免费的有用代理
  • 用Redis来维护池的队列存储
  • 维护池,剔除无用的代理,获得有用的代理
  • Flask是实现代理池的一个接口,返回到web上

抓取微信文章思路

  1. 通过搜狗爬取微信文章
  2. 前十页信息不需要验证,10页到100页需要微信登录验证
  3. 发现浏览多页后会返回302状态码,跳到反爬虫的页面,此时的ip已经被封,需要输入3次验证码才能继续浏览
  4. 具体抓取步骤

1.抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果。
2.代理设置:如果遇到302状态码,则证明IP被封,切换代理重试
3.分析详情页内容:请求详情页,分析得到标题,正文等内容
4.将数据保存到数据库

抓取索引页内容

import requests
from  requests.exceptions import RequestException
from urllib.parse import urlencode
base_url='http://weixin.sogou.com/weixin?'

def get_index(keyword,page):   #get请求参数
    data={
        'query':keyword,
        'type':2,
        'page':page
    }
    queries=urlencode(data)  #把key-value这样的键值对转换格式,返回a=1&b=1这样的字符串
    url=base_url + queries
    html=get_html(url)
    print(html)
headers={
    "Cookie":"GOTO=Af12649; SUV=00E5B570B70C546D5978B8154B874361; IPLOC=CN4403; SUID=6D540CB73320910A000000005978B816; pgv_pvi=1861927936; ABTEST=0|1502751070|v1; weixinIndexVisited=1; SNUID=8CBAF940F7F2AE29D86AFAC9F8AC0210; ld=TZllllllll2BKv3rlllllVuUeVyllllltq7@nyllllwlllll9llll5@@@@@@@@@@; LSTMV=201%2C260; LCLKINT=27637; sw_uuid=3851573336; sg_uuid=3001557157; ssuid=8893341825; dt_ssuid=7044358220; usid=XUhtela4MuqO4WYt; pgv_si=s423112704; JSESSIONID=aaaJ940C2hKSEd-V85U3v; sct=24; ppinf=5|1503111208|1504320808|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZTo3Omluc2lnaHR8Y3J0OjEwOjE1MDMxMTEyMDh8cmVmbmljazo3Omluc2lnaHR8dXNlcmlkOjQ0Om85dDJsdU1zWmxsOWVLRTNwb0M5TTMwLXFVSU1Ad2VpeGluLnNvaHUuY29tfA; pprdig=r6cB7eM-w6v2tvRQ42QrnnZYg1bhefjDUAxJ3pkm2ZzalCVcFlv74Mx4Ubz7E8NroDnQ1oTPxNJkYeBCkI8yqM9VNk7bHeTyMqT8wWjMz6rgh2dzXUE7wb1LGbInPhNUN_A1dTW0QoyV4ZNWaEgik3hYqi1EQwUaVoHAmy-pHLc; sgid=08-30426875-AVmXqCiaDYuwr4vkbBuwLlw0; ppmdig=1503121994000000ef911d3ebbde56dd937521fdd5448948",
    "Host": "weixin.sogou.com",
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3226.400 QQBrowser/9.6.11681.400'
}  #为了能够看到100页后的东西,我们必须登录,这里的cooies就包括我们登录的效果
def get_html(url):
    try:
        response=requests.get(url,allow_redirects=False,headers=headers)#不让自动跳转????
        if response.status_code==200:
            return response.text
        if response.status_code==302:  #此时ip被封了,需要代理池poxy
            pass
    except ConnectionError:
        return get_html(url)

if __name__ == '__main__':
    get_index('风景',1)


输出的部分结果:



    
    
    
    
    
        
    
    
    
    
    风景的相关微信公众号文章 – 搜狗微信搜索
    
    
                    
                    

你可能感兴趣的:(反爬虫微信文章(总结))