標籤:
想法和一些代碼引用邸一幕python培訓黃哥python爬蟲聯想詞視頻,但是太羅嗦。順便整理,而到現在為止,360不傻。它已演變,用原來的方式,有些bug,這接著說。
正題例如以下:
語言:python2.7.6
模組:urllib,urllib2,re,time
目標:輸入隨意詞,抓到其聯想詞
版本號碼:w1
原理:在360搜尋首頁:http://www.so.com/。當你輸入”科技“時,搜尋方塊會列出對應的聯想詞或者短語。我們就是要得到這些聯想詞,那就要爬360的搜尋引擎了。在輸入關鍵詞之前,我們在首頁右鍵。”審查元素“——”Network“——”Name“。輸入之後,以下會出現對應的超連結。我們僅僅觀察”Headers“”Priview“,”Headers“下我們能夠看到”“Request URL”和頭資訊(主機,代理之類的),“Priview”中看到一個我輸入的範例:
suggest_so({"query":"科技 ","result":[{"word":"科技美學"},{"word":"科技苑"},{"word":"科技部"},{"word":"科技管理研究"},{"word":"科技少女喵","obdata":"{\"t\":\"video\",\"d\":[2,\"http:\/\/p0.qhimg.com\/d\/dy_acba03288ce64a69a324a94921324cb6.jpg\",\"\u9ad8\u79d1\u6280\u5c11\u5973\u55b5\",\"http:\/\/www.360kan.com\/tv\/Q4pwcH3lRG4lNn.html\",3,12]}"},{"word":"科技日報"},{"word":"科技發展利大還是弊大"},{"word":"科技超能王"},{"word":"科技網"},{"word":"科技進步與對策"}],"version":"a"});
非常明顯。我們僅僅要抓到裡面的詞就可以,忘了交代。在Request URL中。有一個連結:http://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word=%E7%A7%91%E6%8A%80%20,我們輸入非常多次發現,變得僅僅是“%E7%A7%91%E6%8A%80%20”部分。也就是說前面的部分不變。我們能夠直接拿來用,後面的部分隨著輸入的關鍵詞不同而變化。這是一種URL編碼,能夠用urllb.quote()方法實現。
操作:1.加頭資訊。讀取網頁,相關方法:urllib2.Request()。urllib2.urlopen()。urllib2,urlopen().read()
2.正則匹配:方法:re模組的相關使用方法,各抒己見。
。
代碼例如以下:
#coding:utf-8import urllibimport urllib2import reimport timegjc = urllib.quote("科技")url = "http://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word="+gjcprint urlreq = urllib2.Request(url)html = urllib2.urlopen(req).read()unicodePage = html.decode("utf-8") #正則表達式,findall方法返回一個列表ss = re.findall('"word":\"(.*?)\"',unicodePage)for item in ss: print item
結果:
假設不加unicodePage = html.decode("utf-8") 。返回值會穿插一些亂碼,以下我們驗證下,我們做的對不正確,開啟360搜尋。輸入“科技”。結果例如以下:
大家不要糾結,第一個和第二個關聯詞的順序,我第二次請求的時候就變成了的結果。再一次請求,又變回來了,可能是360在變吧,大家能夠用其它關鍵詞試試。
好,大體架構已經實現,這是個最初版本號碼。還不能全然無限制使用。我們要做的是暢通無阻,那麼存在什麼問題呢?
問 題:1.多次請求會出現一個錯誤,大概代號為1005,意思百度了下,好像是說網站會限制非人為的請求。那我們要偽裝成使用者正常開啟網站的行為。我們要用到頭資訊(這是我自己習慣叫的,我們採用“Request Headers”裡面的資訊就可以
2.請求過快也可能被屏蔽。所以要在每一次請求之後讓爬蟲歇息一下。這就是time.sleep()的作用
3.即使這樣,也有被屏蔽的可能,必殺技:使用ip代理server,百度ip代理,一大堆免費的,方法:見urllib2 api example
最佳化的代碼例如以下:
#coding:utf-8#---------------------# 程式:爬蟲採集360搜尋關聯詞# 語言:python2.7# 版本號碼:w1# 時間:2014-06-14# wxx#---------------------import urllibimport urllib2import reimport timefrom random import choice#ip代理列表iplist = ["14.29.117.36:80","222.66.115.229:80","59.46.72.245:8080"]ip = choice(iplist)#print ip#關鍵詞列表,順序搜尋list = ["集團","科技","python"]for m in list: #quote將m轉變成URL編碼 gjc = urllib.quote(m) url = "http://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word="+gjc #頭資訊 headers = { "GET":url, "Host":"sug.so.360.cn", "Referer":"http://www.so.com/", "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 QIHU 360SE" } #使用IP代理server proxy_handler = urllib2.ProxyHandler({'http': 'http://'+ip}) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) req = urllib2.Request(url) for key in headers: req.add_header(key,headers[key]) html = urllib2.urlopen(req).read() #將其它編碼變成unicode編碼 unicodePage = html.decode("utf-8") #正則表達式。findall方法返回一個列表 ss = re.findall('"word":\"(.*?)\"',unicodePage) for item in ss: print item #休眠2秒 time.sleep(2)
結果:
下一版本號碼的最佳化考慮:
1.讓使用者自助輸入關鍵i詞,不要事先定義關鍵詞列表
2.按斷行符號進行下一個關鍵詞輸入
3.輸出結果儲存txt文本
4.使用者輸入exit。程式退出
參考視頻:http://www.tudou.com/programs/view/SXgshk-sYbw/
著作權聲明:本文部落格原創文章。部落格,未經同意,不得轉載。
python爬行動物集合360聯想詞搜尋