溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python爬蟲(chóng)中爬取代理IP的方法是什么

發(fā)布時(shí)間:2020-08-05 11:16:59 來(lái)源:億速云 閱讀:158 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Python爬蟲(chóng)中爬取代理IP的方法是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

在我們爬蟲(chóng)的過(guò)程中,難免會(huì)遇到比較惡心的網(wǎng)站(安全性較高),來(lái)阻止我們的爬蟲(chóng),跑著跑著,就斷掉了!報(bào)錯(cuò)了??!丟失連接之類(lèi)的。幸幸苦苦的抓了半天又得從頭來(lái),心累??!

這就是網(wǎng)站的反爬蟲(chóng)在起作用了。

一般來(lái)說(shuō)我們會(huì)遇到網(wǎng)站反爬蟲(chóng)策略下面幾點(diǎn):

限制IP訪問(wèn)頻率,超過(guò)頻率就斷開(kāi)連接。(這種方法解決辦法就是,降低爬蟲(chóng)的速度在每個(gè)請(qǐng)求前面加上time.sleep;或者不停的更換代理IP,這樣就繞過(guò)反爬蟲(chóng)機(jī)制啦?。?/p>

后臺(tái)對(duì)訪問(wèn)進(jìn)行統(tǒng)計(jì),如果單個(gè)userAgent訪問(wèn)超過(guò)閾值,予以封鎖。(效果出奇的棒!不過(guò)誤傷也超級(jí)大,一般站點(diǎn)不會(huì)使用,不過(guò)我們也考慮進(jìn)去。

還有針對(duì)于cookies的 (這個(gè)解決辦法更簡(jiǎn)單,一般網(wǎng)站不會(huì)用)

有些網(wǎng)站會(huì)監(jiān)測(cè)你的IP,如果在某一時(shí)間段內(nèi),你的IP多次訪問(wèn)網(wǎng)頁(yè),就會(huì)封鎖你的IP,過(guò)段時(shí)間再放出來(lái)。

對(duì)于第一種限制IP的,我們?cè)趺磥?lái)防止這種反爬蟲(chóng)呢?(與本篇博客無(wú)關(guān),只是想挑起大家的好奇心)

對(duì)咯,就是用代理IP,OK,想要獲取到代理IP,就要找到多個(gè)IP,所以我們今天先做第一步,把代理ip網(wǎng)站的所有IP給抓取下來(lái);

我這里找到的一個(gè)網(wǎng)站是http://www.66ip.cn/,個(gè)人感覺(jué)還不錯(cuò),反正是用來(lái)練手,嘿嘿~~~

步驟1、爬取整個(gè)網(wǎng)頁(yè)

我們的思路是:先把網(wǎng)頁(yè)所有內(nèi)容爬取下來(lái),然后再提取我們需要的信息。

首先按照慣例我們導(dǎo)入模塊:

# -*- coding:utf-8 -*-
import bs4
import urllib
from bs4 import BeautifulSoup
import urllib2

我們寫(xiě)一個(gè)基本的請(qǐng)求網(wǎng)頁(yè)并返回response的函數(shù):

# -*- coding:utf-8 -*-
import bs4
import urllib
from bs4 import BeautifulSoup
import urllib2
#構(gòu)造網(wǎng)頁(yè)請(qǐng)求函數(shù)
def gethtml(url):
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    html = response.read()
    return html

哈哈,簡(jiǎn)單吧!

這只是基本的,其實(shí)學(xué)過(guò)爬蟲(chóng)的都知道,很多網(wǎng)站都都會(huì)拒絕非瀏覽器的請(qǐng)求的、怎么區(qū)分的呢?就是你發(fā)起的請(qǐng)求是否包含正常的User-Agent 這玩意兒長(zhǎng)啥樣兒?就下面這樣(如果不一樣 請(qǐng)按一下F5)

Python爬蟲(chóng)中爬取代理IP的方法是什么

requests的請(qǐng)求的User-Agent 大概是這樣 python-requests/2.3.0 CPython/2.6.6 Windows/7 這個(gè)不是正常的User-Agent、所以我們得自己造一個(gè)來(lái)欺騙服務(wù)器(requests又一個(gè)headers參數(shù)能幫助我們偽裝成瀏覽器哦!不知道的小哥兒 一定是沒(méi)有看官方文檔!在這里request官方文檔這樣很不好誒!o(一︿一+)o),讓他以為我們是真的瀏覽器。

所以我們修改一下代碼:

# -*- coding:utf-8 -*-
import bs4
import urllib
from bs4 import BeautifulSoup
import urllib2
#構(gòu)造網(wǎng)頁(yè)請(qǐng)求函數(shù)
def gethtml(url):
    user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 
    Safari/537.36"
    headers = {"User-Agent":user_agent}
    request = urllib2.Request(url,headers = headers)
    response = urllib2.urlopen(request)
    html = response.read()
    return html

好了,接下來(lái)就要寫(xiě)主函數(shù)了~~擼起袖子開(kāi)干!!

步驟2、打開(kāi)網(wǎng)站,查看IP所處位置

按F12

Python爬蟲(chóng)中爬取代理IP的方法是什么

發(fā)現(xiàn)所有IP信息都在tr標(biāo)簽下的td節(jié)點(diǎn)中。OK,很好,非常好,非常方便~~

現(xiàn)在我們要做的就是找到這個(gè)標(biāo)簽。

先用BeautifulSoup解析網(wǎng)頁(yè)

sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
trs = sp.find_all("tr")
for tr in trs:  # tr是每一行
    for a in tr.children:
        # 發(fā)現(xiàn)a的編碼方式是unicode,所以講unicode轉(zhuǎn)成utf-8字符串
        ip_val = a.string.encode('utf-8').strip()
        print ip_val

好了,上面我們已經(jīng)打印出來(lái)了td標(biāo)簽里面的所有內(nèi)容??墒俏覀冞@里只想要IP怎么辦呢??

好辦,我們來(lái)判斷抓取到的數(shù)據(jù)是不是IP,大家都知道,IP是有四位整數(shù),通過(guò)點(diǎn)(.)來(lái)分隔的。恩,找到規(guī)律后,我們來(lái)定義一個(gè)函數(shù)來(lái)判斷IP。

def is_invalid_ip4(ip):
    ip = ip.strip()
    # ip4格式:a.b.c.d
    its = [v for v in ip.split('.')]
    # .分?jǐn)?shù)不對(duì)
    if len(its) != 4:
        return False
    # 值不是數(shù)字
    for v in its:
        if not v.isdigit():
            return False
    return True

好了,我們來(lái)調(diào)用這個(gè)函數(shù),修改上面的代碼:

#使用beautifulsoup來(lái)解析網(wǎng)頁(yè)
sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
trs = sp.find_all("tr")
#先定義一個(gè)空列表,用于存放爬取到的ip
iplist = []
for tr in trs:
    # tr是每一行
    for a in tr.children:
        # 發(fā)現(xiàn)a的編碼方式是unicode,所以講unicode轉(zhuǎn)成utf-8字符串
        ip_val = a.string.encode('utf-8').strip()
        #調(diào)用判斷有效ip函數(shù)
        if is_invalid_ip4(ip_val):
            iplist.append(ip_val)
            print ip_val
        #這里發(fā)現(xiàn)ip在tr的第一列,所以我們每次取到第一個(gè)數(shù)據(jù)后跳出
        break
print '-'*32#我是分隔符

好了,這樣我們就吧爬取到的IP放進(jìn)了iplist這個(gè)列表里。

怎么樣,很簡(jiǎn)單吧~~

步驟3、整理代碼

那假如我們想要很多條IP怎么辦,一頁(yè)根本不夠啊,OK,統(tǒng)統(tǒng)滿(mǎn)足你——爬取多個(gè)網(wǎng)頁(yè)的IP,就要不停的請(qǐng)求網(wǎng)頁(yè),那這個(gè)網(wǎng)址是變化的怎么辦?

好吧,我又幫你找到規(guī)律了,只需要將網(wǎng)址的index改變就可以了。好吧,

完整代碼:

# -*- coding:utf-8 -*-
import bs4
import urllib
from bs4 import BeautifulSoup
import urllib2
import requests
# 網(wǎng)址:http://www.66ip.cn/index.html
#這里看出每一頁(yè)的網(wǎng)址由index下標(biāo)表示,即index是幾就代表第幾頁(yè)
#我這里只爬取五個(gè),你隨意啊
def main():
    #先定義一個(gè)空列表,用于存放爬取到的ip
    iplist = []
    for i in range(1,5):
        #構(gòu)造url
        s = ".html"
        url = "http://www.66ip.cn/"
        #調(diào)用網(wǎng)頁(yè)請(qǐng)求函數(shù)
        cur_url = url + str(i) + s
        html_doc = gethtml(cur_url)
        #使用beautifulsoup來(lái)解析網(wǎng)頁(yè)
        sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
        trs = sp.find_all("tr")
        for tr in trs:
            # tr是每一行
            for a in tr.children:
                #發(fā)現(xiàn)a的編碼方式是unicode,所以講unicode轉(zhuǎn)成utf-8字符串
                ip_val = a.string.encode('utf-8').strip()
                #調(diào)用判斷有效ip函數(shù)
                if is_invalid_ip4(ip_val):
                    iplist.append(ip_val)
                    print ip_val
                #這里發(fā)現(xiàn)ip在tr的第一列,所以我們每次取到第一個(gè)數(shù)據(jù)后跳出
                break
        print '-'*32#我是分隔符
def is_invalid_ip4(ip):
    ip = ip.strip()
    # ip4格式:a.b.c.d
    its = [v for v in ip.split('.')]
    # .分?jǐn)?shù)不對(duì)
    if len(its) != 4:
        return False
    # 值不是數(shù)字
    for v in its:
        if not v.isdigit():
            return False
    return True
#構(gòu)造網(wǎng)頁(yè)請(qǐng)求函數(shù)
def gethtml(url):
    user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 
    Safari/537.36"
    headers = {"User-Agent":user_agent}
    request = urllib2.Request(url,headers = headers)
    response = urllib2.urlopen(request)
    html = response.read()
    return html
if __name__ == "__main__":
    main()

完美??!

結(jié)果如下:

Python爬蟲(chóng)中爬取代理IP的方法是什么

關(guān)于Python爬蟲(chóng)中爬取代理IP的方法是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI