• [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到不少数据呢

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/cn-lhc/p/6079582.html
Copyright © 2020-2023  润新知