亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

帶你入門Python爬蟲,8個常用爬蟲技巧盤點

發布時間:2020-08-18 19:29:02 來源:ITPUB博客 閱讀:173 作者:博為峰網校 欄目:網絡管理

python作為一門高級編程語言,它的定位是優雅、明確和簡單。 學用 python 差不多一年時間了 ,用得最多的還是各類爬蟲腳本:寫過抓代理本機驗證的腳本,寫過論壇中自動登錄自動發貼的腳本,寫過自動收郵件的腳本,寫過簡單的驗證碼識別的腳本。

帶你入門Python爬蟲,8個常用爬蟲技巧盤點

這些腳本有一個共性,都是和 web相關的,總要用到獲取鏈接的一些方法, 累積 不少爬蟲抓站的經驗,在此總結一下,那么以后做東西也就不用重復勞動了。

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訪問的次數受到限制等等。

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. 偽裝成瀏覽器訪問

某些網站反感爬蟲的到訪,于是對爬蟲一律拒絕請求。這時候我們需要偽裝成瀏覽器,這可以通過修改 http包中的header來實現:

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、頁面解析

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

帶你入門Python爬蟲,8個常用爬蟲技巧盤點  

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

6 .驗證碼的處理

碰到驗證碼咋辦?這里分兩種情況處理:

google那種驗證碼, 沒辦法。

簡單的驗證碼:字符個數有限,只使用了簡單的平移或旋轉加噪音而沒有扭曲的,這種還是有可能可以處理的,一般思路是旋轉的轉回來,噪音去掉,然后劃分單個字符,劃分好了以后再通過特征提取的方法 (例如PCA)降維并生成特征庫,然后把驗證碼和特征庫進行比較。這個比較復雜,這里就不展開了,具體做法請弄本相關教科書好好研究一下。

7.  gzip/deflate支持

現在的網頁普遍支持 gzip壓縮,這往往可以解決大量傳輸時間,以VeryCD的主頁為例,未壓縮版本247K,壓縮了以后45K,為原來的1/5。這就意味著抓取速度會快5倍。

然而 python的urllib/urllib2默認都不支持壓縮,要返回壓縮格式,必須在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打開網頁,如果服務器支持gzip/defalte則自動解壓縮

content = opener.open(url).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()

9. 總結

閱讀 Python編寫的代碼感覺像在閱讀英語一樣,這讓使用者可以專注于解決問題而不是去搞明白語言本身。Python雖然是基于C語言編寫,但是摒棄了C中復雜的指針,使其變得簡明易學。并且作為開源軟件,Python允許對代碼進行閱讀,拷貝甚至改進。這些性能成就了Python的高效率,有“人生苦短,我用Python”之說,是一種十分精彩又強大的語言。

總而言之, 開始學 Python一定要 注意 4 點:

1.代碼規范,這本身就是一個非常好的習慣,如果開始不養好好的代碼規劃,以后會很痛苦

2.多動手,少看書,很多人學Python就一味的看書,這不是學數學物理,你看例題可能就會了,學習Python主要是學習編程思想。

3.勤練習,學完新的知識點,一定要記得如何去應用,不然學完就會忘,學我們這行主要都是實際操作。

4.學習要有效率,如果自己都覺得效率非常低,那就停不停,找一下原因,去問問過來人這是為什么

關注 51Testing軟件測試網,提升it技能,從不會到熟練只差一步。

歡迎加入 51軟件測試大家庭,在這里你將獲得【最新行業資訊】,【免費測試工具安裝包】,【軟件測試技術干貨】,【面試求職技巧】... 51與你共同學習,一起成長!期待你的加入: QQ 2173383349


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石棉县| 南郑县| 斗六市| 出国| 开原市| 辉南县| 花莲县| 宣威市| 江北区| 乾安县| 水城县| 无锡市| 昔阳县| 讷河市| 海南省| 安吉县| 静乐县| 子洲县| 吉安县| 双峰县| 樟树市| 隆安县| 孝昌县| 锦屏县| 遂宁市| 宁阳县| 慈溪市| 太保市| 伊吾县| 日照市| 潮安县| 留坝县| 望江县| 桃江县| 阳谷县| 信阳市| 老河口市| 新民市| 建始县| 东乌| 灌阳县|