[python]用request库来处理Http协议-收集北航表白墙内的数据 1.分析 2.编码与调试 3.后记

最近阅读了《图解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

北航使用率最高的表白墙系统是一个名为”北航微生活“的微信公众号(貌似很多大学都有相应的”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" >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 >,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到不少数据呢