• [python]用request库来处理Http协议-收集北航表白墙内的数据


    最近阅读了《图解Http》这本书.虽然名为“图解”,可说实话里面的图真是啥用都没..不过书还是不错的,两个小时跳读完后,对Http协议有了大概的了解..对于不搞前端开发的我,这些知识应该是够用了。

    继续Python折腾之旅吧!


    Requests is the only Non-GMO HTTP library for Python, safe for human consumption.

    Warning: Recreational use of other HTTP libraries may result in dangerous side-effects, including: security vulnerabilities, verbose code, reinventing the wheel, constantly reading documentation, depression, headaches, or even death.

    (摘录自Requests官方文档,我觉得这是Urllib被黑的最惨的一次233

    1.分析

    北航使用率最高的表白墙系统是一个名为”北航微生活“的微信公众号(貌似很多大学都有相应的”XX微生活“公众号,而且运营结构基本相同,不是很懂为什么…)。

    因为微信公众号平台并不直接开放API,并且访问有一套复杂的验证机制,所以想要直接通过链接来抓取是很难的。网上用的比较多的做法是通过搜狗微信搜索http://weixin.sogou.com/的API来间接实现抓取.

    这样和以前做过的抓取北航教务新闻的爬虫就差不多了.

    但也不是完全一样,还是有些区别的

    • 搜狗的页面有访问限制,未登陆的话只能访问搜索结果的前10页
    • 搜狗有反爬措施,频繁的访问会触发验证码

    本着不在一个小项目内引入太多问题的原则,采取以下简单可行但并不优美的解决方案

    • 现在浏览器内手动登陆,并保存Cookies,让爬虫带着这个Cookies进行访问
    • Time.Sleep

    2.编码与调试

    Requests最大的优势就在于它简介的语法..构造一个标准的Headers如此的简单!

    #_*_ coding: utf-8_*_
    import requests
    import re
    import sys
    import time
    reload(sys)
    sys.setdefaultencoding('utf-8')
    Pattern_url = re.compile('^<a href="(.*?)" target="_blank" id="sogou_vr_11002601_title_." uigs_exp_id=',re.S|re.M)
    DatePattern=re.compile("<strong><span style='color: rgb(112, 48, 160); '>(.*?)</span>",re.S)
    DatePattern2=re.compile("</p><p>(.*?)</p><p><br  />",re.S)
    DatePattern_Time=re.compile('<em id="post-date" class="rich_media_meta rich_media_meta_text">(.*?)</em>',re.S)
    subPattern_img=re.compile('<img data-ratio="1"(.*?)visibility: visible !important;">',re.S)
    subPattern_amp = re.compile('&amp;');
    head={
                 'Host':'weixin.sogou.com',
                 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
                 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                 'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
                 'Accept-Encoding':'gzip, deflate',
                 'Cookie':'CXID=E54348BDD19C7BE40D8BB78FB87F6F1D; ad=evR3vkllll2gKNh2lllllVk7aL1lllll3OhEfkllllwlllll9joll5@@@@@@@@@@; SUID=EABB5C2A4D6C860A577DDC8D000A87F0; IPLOC=CN1100; SUV=1467948688365866; GOTO=Af99046; ssuid=7968034436; sct=35; SNUID=40B49665595D1827AEE18BC259C7FBDA; pgv_pvi=7047098368; ABTEST=4|1478525186|v1; weixinIndexVisited=1; ppinf=5|1478526187|1479735787|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZToyOkNOfGNydDoxMDoxNDc4NTI2MTg3fHJlZm5pY2s6MjpDTnx1c2VyaWQ6NDQ6N0I0RERCQTBFM0EzRTU1NDNFQTMzMURCQUY3MDlEOTlAcXEuc29odS5jb218; pprdig=eQG4Qn0r5NFWN4NjVxwEDfQ5l3XxKlTziCwYn-FTxClrHYaMJ-b7KQoxebNoJbGZeIfeZHOsaLgP0KoEUdfMEaOo6KDb7BJiVF4o9I8saIUjIalujK5Xwr6fen4clOeGWRBJh4_oXzEhaLRzIf5l_Tyb1lrHYQDgdLZssGOEAeU; ld=Qs0bYZllll2YJbdwlllllVkHrF6lllll5G@Hpyllll9lllll9ylll5@@@@@@@@@@; ppmdig=1479459994000000988a368ffbfc7c85801f8b1c32470843; JSESSIONID=aaaPoOvx2NPOfdW2mjwFv; PHPSESSID=bjq68kgcqc3phod5j3eukcsie0; SUIR=40B49665595D1827AEE18BC259C7FBDA; pgv_si=s1257009152; seccodeErrorCount=1|Fri, 18 Nov 2016 09:14:27 GMT; successCount=1|Fri, 18 Nov 2016 09:14:34 GMT; LSTMV=887%2C229; LCLKINT=5042',
         }
    proxies = {
      "http": "http://116.252.158.157:8998",
    }
    
    print 'HELLO'
    for PAGE in range(1,35):
         print 'PAGE'+str(PAGE)
         SearchURL='http://weixin.sogou.com/weixin?query=%E5%8C%97%E8%88%AA%E8%A1%A8%E7%99%BD%E5%A2%99&_sug_type_=&sut=805&lkt=0%2C0%2C0&_sug_=y&type=2&sst0=1479460274521&page='+str(PAGE)+'&ie=utf8&w=01019900&dr=1'
         SearchResult = requests.get(SearchURL,headers=head)
         Obj=re.findall(Pattern_url,SearchResult.text)
         for i in Obj:  
            url= re.sub(subPattern_amp,"&",i)
            page=requests.get(url)
            TIME=re.findall(DatePattern_Time,page.text)
            FILE=open(''.join(TIME)+'.txt', 'w')
            print ''.join(TIME)
            m=re.findall(DatePattern,page.text)
            if len(m):
                pass
            else:
                m=re.findall(DatePattern2,page.text)
            for k in m:
                DATE=re.sub(subPattern_img,"<EMOJI>",k)
                FILE.write(DATE)
                FILE.write('
    ')
            time.sleep(10)
    
    
                  
    
         
         
       

    抓取的速度并不快...不过为了避免被反爬,只能这样了。

    3.后记

    Python 真的是越来越有意思了..当然除了用各种各样的库实现有趣的功能外,我确实有必要加强一下Python的基础语法..

    基础的玩儿法都会的差不多了..下一步该玩玩儿

    • 高效的数据清洗(Beautifulsoap Xpath xml…..)
    • 验证码自动处理(Tesseract,机器学习算法…)
    • 自动化测试(selenium2)
    • 更多Web理论知识(Javascript Jquery Css)
    • 数据库技术(SQL)

    希望尽快结束数据采集的练习。毕竟数据分析才是重头戏

    PS:鉴于各大高校的表白墙格式都差不多..这段代码只需要改一下Cookie和Query字段值就能抓取别的大学的表白墙信息了..感觉要Get到不少数据呢

  • 相关阅读:
    django-filter 使用Filter来筛选你的数据
    Django REST framework
    利用WSGI来部署你的网站
    [GitPython]使用python管理你的git库
    [模拟炉石](三)使用卡牌
    简单说pyglet.event
    [模拟炉石](二)下一步要解决的问题
    [模拟炉石](一)让游戏过程显示到cocos2d中
    docker系列之一:初见docker
    二分查找_递归实现_存在重复元素
  • 原文地址:https://www.cnblogs.com/cn-lhc/p/6079582.html
Copyright © 2020-2023  润新知