Python爬蟲:一些常用的爬蟲技巧總結

1、基本抓取網頁

get方法

import urllib2
url = "http://www.baidu.com"
respons = urllib2.urlopen(url)
print response.read()

post方法

import urllib
import urllib2url = "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 urllib2proxy = 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, cookielibcookie_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 = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", 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來實現,代碼片段如下:

import urllib2headers = {'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、頁面解析

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

正則表達式入門: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 數據 的壓縮率可以很高。

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

于是需要這樣修改代碼:

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 gzipcompresseddata = 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
#具體的處理函數,負責處理單個任務
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()

?

轉載于:https://www.cnblogs.com/rj81/p/6076492.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微型計算機選用要點,微型計算機原理以及應用考試_new要點分析.doc

微型計算機原理以及應用第一章:1.微機的主要的特點是:(1)體積小、重量輕;(2)價格低廉;(3)可靠性高、結構靈活(4)應用面廣2.微型機的分類:按微處理器規模分類:單片機 、個人計算機、 …

到底什么是API經濟

編者按:這是一篇兩年前的文章,作者為原CA TECH的中國區技術總監。他在文章中闡述的問題,今天讀來依舊讓人振聾發聵。但遺憾的是,國人在API成為一種服務的概念上似乎還停留在遙遠的PC時代,說白了還都只是一些低端的數據…

解決Linux下vi或vim操作Found a swap file by the name

在linux下用vi或vim打開 文件時 E325: ATTENTION Found a swap file by the name ".1.py.swp" owned by: liu dated: Sat Apr 20 17:37:19 2019 file name: ~liu/1.py modified: YES user name: liu host name: localhos…

給未來的自己一封信計算機,給未來的自己的一封信范文(精選5篇)

給未來的自己的一封信范文(精選5篇)在日常生活或是工作學習中,大家總免不了要接觸或使用書信吧,書信一般包括稱呼、問候語、正文、祝語、署名、日期六個部分。你知道書信怎樣寫才規范嗎?下面是小編為大家收集的給未來的自己的一封信范文(精選…

matlab神經網絡函數

1.設計函數 solvein 設計線性網絡; solverb 設計徑向基網絡; solverbe 設計精確的徑向基網絡; solvehop 設計Hopfield網絡。 2.傳遞函數 hardlim 硬限幅傳遞函數; hardl…

GBDT算法簡介

在網上看到一篇GBDT介紹非常好的文章,GBDT大概是非常好用又非常好用的算法之一了吧(哈哈 兩個好的意思不一樣) GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算…

DevExpress Chart空間Y軸歸一化(線性歸一化函數)

數據的標準化(normalization)是將數據按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除數據的單位限制,將其轉化為無量綱的純數值,便于不同單位或量級的指標能夠進行比較…

Linux samba的配置和使用

推薦局域網內使用 不推薦遠程服務器 一、安裝Samba服務 yum -y install samba # 查看yum源中Samba版本 yum list | grep samba # 查看samba的安裝情況 rpm -qa | grep samba Samba服務器安裝完之后, 會生成配置文件目錄/etc/samba, /etc/samba/smb.conf是samba的核心配置文件.…

23期PHP基礎班第四天

轉載于:https://www.cnblogs.com/lihang666/p/6078982.html

SVM和SVR簡介

1、支持向量機( SVM )是一種比較好的實現了結構風險最小化思想的方法。它的機器學習策略是結構風險最小化原則 為了最小化期望風險,應同時最小化經驗風險和置信范圍) 支持向量機方法的基本思想: ( 1 &#…

gojs實現最短路徑尋址實例

2019獨角獸企業重金招聘Python工程師標準>>> JS function init() {if (window.goSamples) goSamples(); // init for these samples -- you dont need to call thisvar $ go.GraphObject.make; // for conciseness in defining templatesmyDiagram $(go.Diagram,…

河南王牌計算機專業,河南計算機專業實力突出的7所大學,鄭大位列次席,榜首實至名歸...

鄭州大學是省內唯一的211建設高校,整體辦學實力在國內同類高校之中名列前茅,雖然沒有能夠在學科評估之中取得A類學科,但學校有化學、考古學、材料科學與工程等多個學科獲評B,學校計算機科學與技術學科取得了C的成績,雖…

Linux中配置ftp服務器

1. 先用rpm -qa| grep vsftpd命令檢查是否已經安裝,如果ftp沒有安裝,使用yum -y install vsftpd 安裝,(ubuntu 下使用apt-get install vsftpd) 2. service vsftpd start / service vsftpd restart 啟動要讓FTP每次開機自動啟動,運行命令:…

機器學習中各類算法的優缺點比較

1決策樹(Decision Trees)的優缺點 決策樹的優點: 一、 決策樹易于理解和解釋.人們在通過解釋后都有能力去理解決策樹所表達的意義。 二、 對于決策樹,數據的準備往往是簡單或者是不必要的.其他的技術往往要求先把數據一般化&am…

在程序開發中日志級別

日志打印可以查看代碼的執行情況,以及快速定位錯誤。 在代碼中,特別是業務層邏輯的代碼,適當的添加日志是必須的,一般在catch代碼塊中是出現異常的,如果需要打印 可以用error級別, 一般的無關緊要的日志&am…

基于Python搭建Django后臺管理系統

一、博客網站的創建 創建項目 生成站點(sites)Model,這兩步驟第一篇有介紹,這里就直接操作了 二、數據庫配置 介紹一下數據庫的配置就是在setting里面配置鏈接的數據庫,這里系統以及配置好了,鏈接一個…

計算機研究所專業課,【擇校必看】十三所計算機專業課只考數據結構的985院校!...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓敲黑板:本文涉及到的學校計算機專業考研只考數據結構,其中部分院校同時也會考算法、C語言等相關內容。但是,相對其他幾門,無疑在專業課的復習上大大降低了難度。如果各位同學目前的專…

在Python2.7下如何安裝TA-lib庫

最近在做一個關于股票預測的模型,由于想要用Talib庫中的方法,來提取各種金融技術指標,所以就下了這個庫。但整個過程可謂是一波三折。花費了大半天才搞定這件事。 下面來給大家分享一下安裝的步驟,省的大家再往這個坑里跳。。。 …

JavaScript 實現繼承的5種方式

js是一個面向對象的語言,所以具備一些面向對象的方式----------例如繼承。接下來介紹5種js的繼承方式.注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。 1.采用call方法改變函數上下文實現繼承,原理是改變函數內部的…

day20 django

1、Django請求的生命周期武彥濤:路由系統 -> 試圖函數(獲取模板數據》渲染) -> 字符串返回給用戶2、路由系統王騰:/index/ -> 函數或類.as_view()/detail/(\d) -> 函數(參數) 或 類.as_view()(參數&am…