語言:python2.7.6
模組:urllib,urllib2,re,time
目標:輸入任意詞,抓到其聯想詞
版本:w1
原理:在360搜尋主頁:當你輸入」科技「時,搜尋框會列出相應的聯想詞或者短語,我們就是要得到這些聯想詞,那就要爬360的搜尋引擎了。在輸入關鍵詞之前,我們在主頁右鍵,」審查元素「——」network「——」name「,輸入之後,下面會出現相應的超連結,我們只觀察」headers「」priview「,」headers「下我們可以看到」「request url」和頭資訊(主機,**之類的),「priview」中看到乙個我輸入的例子:
suggest_so(,,,,"},,,,,],"version":"a"});
很明顯,我們只要抓到裡面的詞即可,忘了交代,在request url中,有乙個鏈結:我們輸入很多次發現,變得只是「%e7%a7%91%e6%8a%80%20」部分,也就是說前面的部分不變,我們可以直接拿來用,後面的部分隨著輸入的關鍵詞不同而變化,這是一種url編碼,可以用urllb.quote()方法實現。
操作:1.加頭資訊,讀取網頁,相關方法:urllib2.request(),urllib2.urlopen(),urllib2,urlopen().read()
2.正則匹配:方法:re模組的相關用法,各抒己見。。
**如下:
#coding:utf-8
import urllib
import urllib2
import re
import time
gjc = urllib.quote("科技")
url = ""+gjc
print url
req = 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**伺服器,百度ip**,一大堆免費的,方法:見urllib2 api example
優化的**如下:
#coding:utf-8
#---------------------
# 程式:爬蟲採集360搜尋關聯詞
# 語言:python2.7
# 版本:w1
# 時間:2014-06-14
# 作者:wxx
#---------------------
import urllib
import urllib2
import re
import time
from 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 = ""+gjc
#頭資訊
headers =
#使用ip**伺服器
proxy_handler = urllib2.proxyhandler()
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,程式退出
python爬蟲之xpath資料採集
使用方式有兩種 1.最基本的lxml解析方式 from lxml import etree doc etree.parse exsample.html 2.另一種 from lxml import html text requests.get url text ht html.fromstring ...
Python爬蟲之表單和登入視窗採集
python自帶的urllib庫實現了http基本的get功能,當我們想要實現比get更多的事情時,那麼就需要去尋找支援python標準的第三方庫了。requests庫可以成為你的選擇,它可以處理複雜的http請求,cookie,header等內容,是乙個第三方庫。可以使用python包管理器,執行...
python爬蟲入門 初步採集
獲取維基百科 的任何頁面並提取頁面鏈結 import urllib2 import bs4 html urllib2.urlopen bsobj bs4.beautifulsoup html.read lxml for link in bsobj.find a if href in link.att...