[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('&'); 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):passelse:m=re.findall(DatePattern2,page.text)for k in m:DATE=re.sub(subPattern_img,"<EMOJI>",k)FILE.write(DATE)FILE.write('\n')time.sleep(10)抓取的速度并不快...不過為了避免被反爬,只能這樣了。
3.后記
Python 真的是越來越有意思了..當然除了用各種各樣的庫實現有趣的功能外,我確實有必要加強一下Python的基礎語法..
基礎的玩兒法都會的差不多了..下一步該玩玩兒
- 高效的數據清洗(Beautifulsoap Xpath xml…..)
- 驗證碼自動處理(Tesseract,機器學習算法…)
- 自動化測試(selenium2)
- 更多Web理論知識(Javascript Jquery Css)
- 數據庫技術(SQL)
希望盡快結束數據采集的練習。畢竟數據分析才是重頭戲
PS:鑒于各大高校的表白墻格式都差不多..這段代碼只需要改一下Cookie和Query字段值就能抓取別的大學的表白墻信息了..感覺要Get到不少數據呢
轉載于:https://www.cnblogs.com/cn-lhc/p/6079582.html
總結
以上是生活随笔為你收集整理的[python]用request库来处理Http协议-收集北航表白墙内的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网概论
- 下一篇: 心情日志 —— 2015/09/09