您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python爬蟲的8個常用技巧分別是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
python作為一門高級編程語言,它的定位是優(yōu)雅、明確和簡單。我學(xué)用python差不多一年時間了,用得最多的還是各類爬蟲腳本:寫過抓代理本機(jī)驗證的腳本,寫過論壇中自動登錄自動發(fā)貼的腳本,寫過自動收郵件的腳本,寫過簡單的驗證碼識別的腳本。
這些腳本有一個共性,都是和web相關(guān)的,總要用到獲取鏈接的一些方法,故累積了不少爬蟲抓站的經(jīng)驗,在此總結(jié)一下,那么以后做東西也就不用重復(fù)勞動了。
1、基本抓取網(wǎng)頁
get方法
import urllib2
url = "http://www.baidu.com"
response = urllib2.urlopen(url)
print response.read()
post方法
import urllib
import urllib2
url = "http://abcde.com"
form = {'name':'abc','password':'1234'}
form_data = urllib.urlencode(form)
request = urllib2.Request(url,form_data)
response = urllib2.urlopen(request)
print response.read()
2.使用代理服務(wù)器
這在某些情況下比較有用,比如IP被封了,或者比如IP訪問的次數(shù)受到限制等等。
import urllib2
proxy_support = urllib2.ProxyHandler({'http':'http://XX.XX.XX.XX:XXXX'})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()
3.Cookies處理
import urllib2, cookielib
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()
是的沒錯,如果想同時用代理和cookie,那就加入proxy_support然后operner改為
opener=urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)
4.偽裝成瀏覽器訪問
某些網(wǎng)站反感爬蟲的到訪,于是對爬蟲一律拒絕請求。這時候我們需要偽裝成瀏覽器,這可以通過修改http包中的header來實現(xiàn):
headers = {
'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
req = urllib2.Request(
url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',
data = postdata,
headers = headers
)
5、頁面解析
對于頁面解析最強(qiáng)大的當(dāng)然是正則表達(dá)式,這個對于不同網(wǎng)站不同的使用者都不一樣,就不用過多的說明。
其次就是解析庫了,常用的有兩個lxml和BeautifulSoup。
對于這兩個庫,我的評價是,都是HTML/XML的處理庫,Beautifulsoup純python實現(xiàn),效率低,但是功能實用,比如能用通過結(jié)果搜索獲得某個HTML節(jié)點(diǎn)的源碼;lxmlC語言編碼,高效,支持Xpath。
6.驗證碼的處理
碰到驗證碼咋辦?這里分兩種情況處理:
google那種驗證碼,沒辦法。
簡單的驗證碼:字符個數(shù)有限,只使用了簡單的平移或旋轉(zhuǎn)加噪音而沒有扭曲的,這種還是有可能可以處理的,一般思路是旋轉(zhuǎn)的轉(zhuǎn)回來,噪音去掉,然后劃分單個字符,劃分好了以后再通過特征提取的方法(例如PCA)降維并生成特征庫,然后把驗證碼和特征庫進(jìn)行比較。這個比較復(fù)雜,這里就不展開了,具體做法請弄本相關(guān)教科書好好研究一下。
7. gzip/deflate支持
現(xiàn)在的網(wǎng)頁普遍支持gzip壓縮,這往往可以解決大量傳輸時間,以VeryCD的主頁為例,未壓縮版本247K,壓縮了以后45K,為原來的1/5。這就意味著抓取速度會快5倍。
然而python的urllib/urllib2默認(rèn)都不支持壓縮,要返回壓縮格式,必須在request的header里面寫明’accept-encoding’,然后讀取response后更要檢查header查看是否有’content-encoding’一項來判斷是否需要解碼,很繁瑣瑣碎。如何讓urllib2自動支持gzip, defalte呢?
其實可以繼承BaseHanlder類,然后build_opener的方式來處理:
import urllib2
from gzip import GzipFile
from StringIO import StringIO
class ContentEncodingProcessor(urllib2.BaseHandler):
"""A handler to add gzip capabilities to urllib2 requests """
# add headers to requests
def http_request(self, req):
req.add_header("Accept-Encoding", "gzip, deflate")
return req
# decode
def http_response(self, req, resp):
old_resp = resp
# gzip
if resp.headers.get("content-encoding") == "gzip":
gz = GzipFile(
fileobj=StringIO(resp.read()),
mode="r"
)
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)
resp.msg = old_resp.msg
# deflate
if resp.headers.get("content-encoding") == "deflate":
gz = StringIO( deflate(resp.read()) )
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code) # 'class to add info() and
resp.msg = old_resp.msg
return resp
# deflate support
import zlib
def deflate(data): # zlib only provides the zlib compress format, not the deflate format;
try: # so on top of all there's this workaround:
return zlib.decompress(data, -zlib.MAX_WBITS)
except zlib.error:
return zlib.decompress(data)
然后就簡單了,
encoding_support = ContentEncodingProcessor
opener = urllib2.build_opener( encoding_support, urllib2.HTTPHandler )
#直接用opener打開網(wǎng)頁,如果服務(wù)器支持gzip/defalte則自動解壓縮
content = opener.open(url).read()
8、多線程并發(fā)抓取
單線程太慢的話,就需要多線程了,這里給個簡單的線程池模板 這個程序只是簡單地打印了1-10,但是可以看出是并發(fā)的。
雖然說Python的多線程很雞肋,但是對于爬蟲這種網(wǎng)絡(luò)頻繁型,還是能一定程度提高效率的。
from threading import Thread
from Queue import Queue
from time import sleep
# q是任務(wù)隊列
#NUM是并發(fā)線程總數(shù)
#JOBS是有多少任務(wù)
q = Queue()
NUM = 2
JOBS = 10
#具體的處理函數(shù),負(fù)責(zé)處理單個任務(wù)
def do_somthing_using(arguments):
print arguments
#這個是工作進(jìn)程,負(fù)責(zé)不斷從隊列取數(shù)據(jù)并處理
def working():
while True:
arguments = q.get()
do_somthing_using(arguments)
sleep(1)
q.task_done()
#fork NUM個線程等待隊列
for i in range(NUM):
t = Thread(target=working)
t.setDaemon(True)
t.start()
#把JOBS排入隊列
for i in range(JOBS):
q.put(i)
#等待所有JOBS完成
q.join()
9. 總結(jié)
閱讀Python編寫的代碼感覺像在閱讀英語一樣,這讓使用者可以專注于解決問題而不是去搞明白語言本身。Python雖然是基于C語言編寫,但是摒棄了C中復(fù)雜的指針,使其變得簡明易學(xué)。并且作為開源軟件,Python允許對代碼進(jìn)行閱讀,拷貝甚至改進(jìn)。這些性能成就了Python的高效率,有“人生苦短,我用Python”之說,是一種十分精彩又強(qiáng)大的語言。
總而言之,開始學(xué)Python一定要注意這4點(diǎn):
1.代碼規(guī)范,這本身就是一個非常好的習(xí)慣,如果開始不養(yǎng)好好的代碼規(guī)劃,以后會很痛苦。
2.多動手,少看書,很多人學(xué)Python就一味的看書,這不是學(xué)數(shù)學(xué)物理,你看例題可能就會了,學(xué)習(xí)Python主要是學(xué)習(xí)編程思想。
3.勤練習(xí),學(xué)完新的知識點(diǎn),一定要記得如何去應(yīng)用,不然學(xué)完就會忘,學(xué)我們這行主要都是實際操作。
4.學(xué)習(xí)要有效率,如果自己都覺得效率非常低,那就停不停,找一下原因,去問問過來人這是為什么。
關(guān)于Python爬蟲的8個常用技巧分別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。