Skip to main content
 首頁 » 程序教程

比較常用的Python爬蟲技巧總結

2017年02月21日1002624j_hao104

用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。爬蟲在開發過程中也有很多復用的過程,這里總結一下,以后也能省些事情。原文基于Python2,本人整理過程中修改為Python3。

1、基本抓取網頁

get方法

from urllib import request

url = "http://www.baidu.com"
res = request.urlopen(url)
print(res.read())

post方法

from urllib import request
from urllib import parse

url = "http://www.baidu.com/s"
form = {'wd': 'abc'}
form_data = parse.urlencode(form)
form_data = form_data.encode('utf-8')
res = request.urlopen(url, form_data)
print(res.read())

2、使用代理IP

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

from urllib import request

url = "http://www.baidu.com/s"
proxy = request.ProxyHandler({'http': '27.204.194.125:9999'})
opener = request.build_opener(proxy)
request.install_opener(opener)
res = request.urlopen(url)
print(res.read().decode('utf-8'))

3、Cookies處理

cookies是某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密),python提供了cookielib模塊用于處理cookies,cookielib模塊的主要作用是提供可存儲cookie的對象,以便于與urllib模塊配合使用來訪問Internet資源.

代碼片段:

from urllib import request
from http import cookiejar

url = "http://www.baidu.com/s"
cookie_support = request.HTTPCookieProcessor(cookiejar.CookieJar())
opener = request.build_opener(cookie_support)
request.install_opener(opener)
content = request.urlopen(url).read()
print(content.decode('utf-8'))

關鍵在于CookieJar(),它用于管理HTTP cookie值、存儲HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的對象。整個cookie都存儲在內存中,對CookieJar實例進行垃圾回收后cookie也將丟失,所有過程都不需要單獨去操作。

4、偽裝成瀏覽器

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

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

2.Content-Type 在使用 REST 接口時,Server 會檢查該值,用來確定 HTTP Body 中的內容該怎樣解析。

這時可以通過修改http包中的header來實現,代碼片段如下:

from urllib import request

url = "http://www.baidu.com/"
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'
}
requests = request.Request(
    url=url,
    headers=headers
)
content = request.urlopen(requests).read()
print(content.decode('utf-8'))

5、頁面解析

對于頁面解析最強大的當然是正則表達式,這個對于不同網站不同的使用者都不一樣,就不用過多的說明,附兩個比較好的網址:

正則表達式入門:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

正則表達式在線測試:http://tool.oschina.net/regex/

其次就是解析庫了,常用的有兩個lxml和BeautifulSoup,對于這兩個的使用介紹兩個比較好的網站:

lxml:http://my.oschina.net/jhao104/blog/639448

BeautifulSoup:http://cuiqingcai.com/1319.html

對于這兩個庫,我的評價是,都是HTML/XML的處理庫,Beautifulsoup純python實現,效率低,但是功能實用,比如能用通過結果搜索獲得某個HTML節點的源碼;lxmlC語言編碼,高效,支持Xpath

6、驗證碼的處理

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

7、gzip壓縮

有沒有遇到過某些網頁,不論怎么轉碼都是一團亂碼。哈哈,那說明你還不知道許多web服務具有發送壓縮數據的能力,這可以將網絡線路上傳輸的大量數據消減 60% 以上。這尤其適用于 XML web 服務,因為 XML 數據 的壓縮率可以很高。

但是一般服務器不會為你發送壓縮數據,除非你告訴服務器你可以處理壓縮數據。于是需要這樣修改代碼:

from urllib import request

url = "http://www.baidu.com/"
requests = request.Request(url)
requests.add_header('Accept-encoding', 'gzip')
opener = request.build_opener()
f = opener.open(request)

這是關鍵:創建Request對象,添加一個 Accept-encoding 頭信息告訴服務器你能接受 gzip 壓縮數據。然后就是解壓縮數據:

from io import StringIO
import gzip

compressed_data = f.read()
compressed_stream = StringIO(compressed_data)
gzipper = gzip.GzipFile(fileobj=compressed_stream)
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


# 具體的處理函數,負責處理單個任務
def do_somthing_using(arguments):
    print(arguments)


# 這個是工作進程,負責不斷從隊列取數據并處理
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()
閱讀延展
評論列表24條評論
兒童
兒童回復 文章不錯!寫的很好我頂??!頂頂頂我踩!我踩踩踩我踩!我踩踩踩
兒童
兒童回復 文章不錯!寫的很好我頂??!頂頂頂我踩!我踩踩踩[angry][awkward][boom][bye][cry][effort][exclaim][grimace][grin][kiss][laugh][love][mad][neutral][neutral][roll][shutup][surprise][twisted][waii]
大家好
大家好回復 文章不錯!寫的很好我頂上了
八角網賺站
八角網賺站回復 博主有一段時間沒更新了啊
百萬鏈
百萬鏈回復 有幸訪問到貴站,“百萬鏈”期待你的加入!
頭條
頭條回復 文章不錯非常喜歡
源碼交易
源碼交易回復 文章不錯非常喜歡
外匯賬戶托管
外匯賬戶托管回復 文章不錯!寫的很好我頂上。。。
百萬鏈
百萬鏈回復 2017年的文章了?
丘八
丘八回復 簡潔實用,好文章!
棋游之家
棋游之家回復 這個爬蟲技巧不錯
貴陽捉雞麻將下載
貴陽捉雞麻將下載回復 爬蟲技術不錯
妙文屋
妙文屋回復 寫的很好,很喜歡
期貨資訊
期貨資訊回復 爬蟲技術不錯喲
武陵紅苗
武陵紅苗回復 牛逼
熱搜榜
熱搜榜回復 文章不錯非常喜歡
今日新鮮事
今日新鮮事回復 文章非常好超喜歡
今日新聞
今日新聞回復 文章非常好超喜歡
招投標
招投標回復 文章 很棒 歡迎回訪我哦
跨境電商運營
跨境電商運營回復 非常不錯的文章 下次還會再來!
今日頭條新聞
今日頭條新聞回復 文章不錯關注一下
自媒體運營
自媒體運營回復 不錯,必須頂一下!
王洛陽
王洛陽回復 noniu.com域名賣嗎 賣的話加我微信13755991653,其他域名也可以
發表評論
中文字幕亚洲欧美|欧美97人人模人人爽|av鲁丝一区鲁丝二区鲁丝三区|巨大黑人极品VIDEOS精品