最近阅读了《图解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('&'); 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到不少数据呢