Python 爬蟲:8 個常用的爬蟲技巧總結!

2021-03-06 office生活

用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。

爬蟲在開發過程中也有很多復用的過程,這裡總結一下,以後也能省些事情。

import urllib2
url  "http://www.baidu.com"
respons = 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()

在開發爬蟲過程中經常會遇到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()

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)

某些網站反感爬蟲的到訪,於是對爬蟲一律拒絕請求。所以用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()

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

正則表達式入門: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

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

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

但是一般伺服器不會為你發送壓縮數據,除非你告訴伺服器你可以處理壓縮數據。

於是需要這樣修改代碼:

import urllib2, httplib

request = urllib2.Request('http://xxxx.com')
request.add_header('Accept-encoding', 'gzip')        1
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()

單線程太慢的話,就需要多線程了,這裡給個簡單的線程池模板 這個程序只是簡單地列印了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()                                                                                                                      

1、如果覺得今天的內容對你有用的話,就點亮文末右下角的【在看】和【點讚】支持一下我吧,要不以後你就見不到我了~

趕快來關注吧,這裡有你想要的各種資料,還有海量的辦公精品模板資源,還在等什麼。快來關注,專業老師帶你提高工作效率。


更多精彩活動、有趣互動,Excel、Word、PPT、思維導圖,使用教程,在線諮詢請添加office微信:

本文圖片及素材內容來源於網絡,版權歸原作者所有;如有侵權,請與我們聯繫刪除!

相關焦點

  • Python爬蟲:一些常用的爬蟲技巧總結
    也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。爬蟲在開發過程中也有很多復用的過程,這裡總結一下,以後也能省些事情。
  • 10個Python爬蟲入門實例
    常用方法之get方法實例,下面還有傳參實例# 第二個get方法實例import requests #先導入爬蟲的庫,不然調用不了爬蟲的函數response = requests.get("http://httpbin.org/get") #get方法print( response.status_code )
  • Python開發簡單爬蟲【學習資料總結】
    開發爬蟲步驟 python語言基礎:(帶你熟悉python語言的特性 (6)Pygame實戰飛機大戰 python語言高級:(python語言的高級庫,常用的企業級開發案例實戰) (1)Python常見第三方庫與網絡編程 (2)面向對象,Python正則表達式 (3)求職數據爬蟲,金融數據爬蟲
  • Python爬蟲之urllib庫—爬蟲的第一步
    ----被urllib使用的response類 這4個屬性中最重要的當屬request了,它完成了爬蟲大部分的功能,我們先來看看request是怎麼用的。修改代碼如下:import urllib.requestresponse = urllib.request.urlopen('http://python.org/')result = response.read().decode('utf-8')print(result)運行結果:<!
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。
  • 適合新手學習的Python爬蟲書籍
    全書分兩部分:首部分介紹用Python 編程所必須了解的基本概念,包括matplotlib、NumPy和Pygal等強大的Python庫和工具介紹,以及列表、字典、if語句、類、文件與異常、代碼測試等內容;第二部分將理論付諸實踐,講解如何開發三個項目,包括簡單的Python 2D遊戲開發,如何利用數據生成交互式的信息圖,以及創建和定製簡單的Web應用,並幫讀者解決常見編程問題和困惑。
  • Python 爬蟲「學前班」!學會免踩坑!
    作者 | 喵叔責編 | 胡巍巍爬蟲應用的廣泛,例如搜尋引擎、採集數據、廣告過濾、數據分析等。當我們對少數網站內容進行爬取時寫多個爬蟲還是有可能的,但是對於需要爬取多個網站內容的項目來說是不可能編寫多個爬蟲的,這個時候我們就需要智能爬蟲。
  • Python爬蟲學習的完整路線推薦
    urllib2文檔   https://dwz.cn/8hEGdsqDrequests文檔   http://t.cn/8Fq1aXrselenium文檔  https://dwz.cn/DlL9j9hf
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    ,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐 總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(
  • Python爬蟲知識點梳理
    作為零基礎小白,大體上可分為三個階段去實現,第一階段是入門,掌握必備基礎知識,比如Python基礎、網絡請求的基本原理等,第二階段是模仿,跟著別人的爬蟲代碼學,弄懂每一行代碼,熟悉主流的爬蟲工具,第三階段是自己動手,到了這個階段你開始有自己的解題思路了,可以獨立設計爬蟲系統。
  • python 爬蟲 | 解析庫之 XPath(1)
    自己學習 python 爬蟲已經有段時間了,但編程的學習過程總是邊學邊忘
  • Python破解反爬蟲:最新反爬蟲有道翻譯中英文互譯破解,附代碼
    由於爬蟲的出現,導致很多網頁都設置了反爬蟲機制:常見的反爬蟲機制就是在客戶端發出請求的時候,在請求的內容中新增一些內容,而這些內容都是經過「加密的」,每次請求都是不同的,這樣就導致了很多傳統的爬蟲失效。
  • Python 爬蟲入門
    從而爬蟲工程師、數據分析師、大數據工程師的崗位也越來越受歡迎。爬蟲是 Python 應用的領域之一。有 Python 基礎對於學習 Python 爬蟲具有事半功倍的效果。就像學英語一樣,一個對英語一概不通的人聽完別人讀英語,自己也能讀出來,但要把英語讀好,學好音標非常有必要。
  • python爬蟲-- Scrapy入門
    前言轉行做python程式設計師已經有三個月了,這三個月用Scrapy爬蟲框架寫了兩百多個爬蟲,不能說精通了Scrapy,但是已經對Scrapy有了一定的熟悉
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • 從零開始的python爬蟲速成指南
    在前言:最近後臺有人留言問:有沒有python爬蟲的相關教程,爬蟲不是我專業方向,很多不是很熟悉,而網上很多資料講的過於散亂,不能很好的系統性學習爬蟲,而且水平參差不齊。特委託一位熟悉爬蟲的小夥伴,幫忙把關,將網上現有資料進行整合,整理了一份相對比較系統的資料。
  • Python爬蟲常用庫之urllib詳解
    ', 7 'remember': 'on', 8 'login': '登錄'} 9# 將data的字典類型轉換為get請求方式10data = bytes(parse.urlencode(data), encoding='utf-8')11requests = request.Request('https://accounts.douban.com/login
  • Python爬蟲入門教程:超級簡單的Python爬蟲教程
    這是一篇詳細介紹 Python 爬蟲入門的教程,從實戰出發,適合初學者。讀者只需在閱讀過程緊跟文章思路,理清相應的實現代碼,30 分鐘即可學會編寫簡單的 Python 爬蟲。關於爬蟲的合法性幾乎每一個網站都有一個名為 robots.txt 的文檔,當然也有部分網站沒有設定 robots.txt。對於沒有設定 robots.txt 的網站可以通過網絡爬蟲獲取沒有口令加密的數據,也就是該網站所有頁面數據都可以爬取。
  • Python 爬蟲必殺技:XPath
    》或《8月Stata數據分析法律與制度專場來啦!》,即可獲得600元課程優惠券,集贊50個再領200元課程優惠券!(截圖發至本公眾號後臺領取)原價2400元的課程,現在只要1600元!   小夥伴、大夥伴們,大家好~今天要給大家介紹的是Python 爬蟲必殺技:XPath。1. 簡介一提到網絡爬蟲,就不得不提到Xpath Helper,我們常常用它來對所要提取的文本內容進行定位,詳情可參考推文《Xpath Helper助Xpath爬蟲一臂之力》。除了這一利器外,了解Xpath定位的原理及其基本用法可以大幅提高我們的爬蟲技巧。
  • 10個python爬蟲入門實例教程
    #設置編碼格式print("狀態碼:"+ str( response.status_code ) ) #列印狀態碼print(response.text)#輸出爬取的信息2.常用方法之get方法實例,下面還有傳參實例# 第二個get方法實例import requests #先導入爬蟲的庫,不然調用不了爬蟲的函數