當前位置: 妍妍網 > 碼農

Python爬蟲高手必備的8大技巧!

2024-06-11碼農

點選上方 " Python人工智慧技術 " 關註, 星標或者置頂

22點24分準時推播,第一時間送達

後台回復「 大禮包 」,送你特別福利

編輯:樂樂 | 來自: 七天小碼哥

上一篇:

正文

大家好,我是Python人工智慧技術

想要快速學習爬蟲,最值得學習的語言一定是Python,Python套用場景比較多,比如: Web快速開發、爬蟲、自動化運維等等, 可以做簡單網站、自動發帖指令碼、收發信件指令碼、簡單驗證碼辨識指令碼。

爬蟲在開發過程中也有很多復用的過程,今天就總結一下必備的8大技巧,以後也能省時省力,高效完成任務。

1 基本抓取網頁

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 使用代理IP

在開發爬蟲過程中經常會遇到 IP被封掉 的情況,這時就需要用到代理IP;在urllib2包中有ProxyHandler類,透過此類可以設定 代理存取網頁 ,如下程式碼片段:

import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')
print response.read()

3 Cookies處理

cookies是某些網站為了 辨別使用者身份 、進行session跟蹤而儲存在使用者本地終端上的數據(通常經過加密),python提供了cookielib模組用於處理cookies,cookielib模組的主要作用是提供可儲存cookie的物件,以便於與urllib2模組配合使用來存取Internet資源。
程式碼片段:

import urllib2, cookielib
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

關鍵在於CookieJar(),它用於管理HTTP cookie值、儲存HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的物件。整個cookie都儲存在記憶體中,對CookieJar例項進行垃圾回收後cookie也將遺失,所有過程都不需要單獨去操作。
手動添加cookie:

cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", cookie)

4 偽裝成瀏覽器

某些網站反感爬蟲的到訪,於是對爬蟲一律拒絕請求。所以用urllib2直接存取網站經常會出現 HTTP Error 403: Forbidden 的情況。
對有些 header 要特別留意,Server 端會針對這些 header 做檢查:

  • User-Agent 有些 Server 或 Proxy 會檢查該值,用來判斷是否是瀏覽器發起的 Request

  • Content-Type 在使用 REST 介面時,Server 會檢查該值,用來確定 HTTP Body 中的內容該怎樣解析

  • 這時可以透過修改http包中的header來實作,程式碼片段如下:

    import urllib2
    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'
    }
    request = urllib2.Request(
    url = 'http://my.oschina.net/jhao104/blog?catalog=3463517',
    headers = headers
    )
    print urllib2.urlopen(request).read()

    5 頁面解析

    對於頁面解析最強大的當然是 正規表式 ,這個對於不同網站不同的使用者都不一樣,就不用過多的說明其次就是 解析庫 了,常用的有兩個lxml和BeautifulSoup對於這兩個庫,我的評價是,都是HTML/XML的處理庫,Beautifulsoup純python實作,效率低,但是 功能實用 ,比如能用透過結果搜尋獲得某個HTML節點的源碼;lxml C語言編碼,高效,支持Xpath。

    6 驗證碼的處理

    對於一些簡單的驗證碼,可以進行簡單的辨識。本人也只進行過一些簡單的驗證碼辨識。但是有些反人類的驗證碼,比如12306,可以透過打碼平台進行人工打碼,當然這是要付費的。

    7 gzip壓縮

    有沒有遇到過某些網頁,不論怎麽轉碼都是一團亂碼。哈哈,那說明你還不知道 許多web服務具有發送壓縮數據的能力 ,這可以將網路路線上傳輸的大量數據 消減 60%****以上 。這尤其適用於XML web 服務,因為 XML 數據 的壓縮率可以很高。
    但是一般伺服器不會為你發送壓縮數據,除非你告訴伺服器你可以處理壓縮數據。
    於是需要這樣修改程式碼:

    import urllib2, httplib
    request = urllib2.Request('http://xxxx.com')
    request.add_header('Accept-encoding', 'gzip')
    opener = urllib2.build_opener()
    f = opener.open(request)

    這是關鍵:建立Request物件,添加一個 Accept-encoding 頭資訊告訴伺服器你能接受 gzip 壓縮數據。

    然後就是解壓縮數據:

    import StringIO
    import gzip
    compresseddata = f.read()
    compressedstream = StringIO.StringIO(compresseddata)
    gzipper = gzip.GzipFile(fileobj=compressedstream)
    print gzipper.read()

    8 多執行緒並行抓取

    單執行緒太慢的話,就需要多執行緒了,這裏給個簡單的執行緒池樣版 這個程式只是簡單地打印了1-10,但是可以看出是並行的。
    雖然說Python的多執行緒很雞肋,但是對於爬蟲這種網路頻繁型,還是能一定程度提高效率的。

    from threading import Thread
    from Queue import Queue
    from time import sleep
    # q是任務佇列
    #NUM是並行執行緒總數
    #JOBS是有多少任務
    q = Queue()
    NUM = 2
    JOBS = 10
    #具體的處理常式,負責處理單個任務
    defdo_somthing_using(arguments):
    print arguments
    #這個是工作行程,負責不斷從佇列取數據並處理
    defworking():
    whileTrue:
    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()

    為了跟上AI時代我幹了一件事兒,我建立了一個知識星球社群:ChartGPT與副業。想帶著大家一起探索 ChatGPT和新的AI時代

    有很多小夥伴搞不定ChatGPT帳號,於是我們決定,凡是這三天之內加入ChatPGT的小夥伴,我們直接送一個正常可用的永久ChatGPT獨立帳戶。

    不光是增長速度最快,我們的星球品質也絕對經得起考驗,短短一個月時間,我們的課程團隊釋出了 8個專欄、18個副業計畫

    簡單說下這個星球能給大家提供什麽:

    1、不斷分享如何使用ChatGPT來完成各種任務,讓你更高效地使用ChatGPT,以及副業思考、變現思路、創業案例、落地案例分享。

    2、分享ChatGPT的使用方法、最新資訊、商業價值。

    3、探討未來關於ChatGPT的機遇,共同成長。

    4、幫助大家解決ChatGPT遇到的問題。

    5、 提供一整年的售後服務,一起搞副業

    星球福利:

    1、加入星球4天後,就送ChatGPT獨立帳號。

    2、邀請你加入ChatGPT會員交流群。

    3、贈送一份完整的ChatGPT手冊和66個ChatGPT副業賺錢手冊。

    其它福利還在籌劃中... 不過,我給你大家保證,加入星球後,收獲的價值會遠遠大於今天加入的門票費用 !

    本星球第一期原價 399 ,目前屬於試營運,早鳥價 169 ,每超過50人漲價10元,星球馬上要來一波大的漲價,如果你還在猶豫,可能最後就要以 更高價格加入了 。。

    早就是優勢。建議大家盡早以便宜的價格加入!

    歡迎有需要的同學試試,如果本文對您有幫助,也請幫忙點個 贊 + 在看 啦!❤️

    在 還有更多優質計畫系統學習資源,歡迎分享給其他同學吧!

    你還有什 麽想要補充的嗎?

    免責聲明:本文內容來源於網路,文章版權歸原作者所有,意在傳播相關技術知識&行業趨勢,供大家學習交流,若涉及作品版權問題,請聯系刪除或授權事宜。

    技術君個人微信

    添加技術君個人微信即送一份驚喜大禮包

    → 技術資料共享

    → 技術交流社群

    --END--

    往日熱文:

    Python程式設計師深度學習的「四大名著」:

    這四本書著實很不錯!我們都知道現在機器學習、深度學習的資料太多了,面對海量資源,往往陷入到「無從下手」的困惑出境。而且並非所有的書籍都是優質資源,浪費大量的時間是得不償失的。給大家推薦這幾本好書並做簡單介紹。

    獲得方式:

    1.掃碼關註本公眾號

    2.後台回復關鍵詞:名著

    ▲長按掃描關註,回復名著即可獲取