使用代理池用py完整的爬取一個網站(尾部有github原始碼)

wangchunbo發表於2020-09-10

一:對返回ip格式的操作,很顯然XX代理是給出json格式的資料,可以直接請求後返回json資料進行操作包過提取,刪除,增加。當然,在實際使用ip代理的時候最好先在瀏覽器中請求一次,複製下來新建一個py檔案練習對其操作。
二:ip的有效期,現在大部分的ip代理都是有有效期的,(本文的ip處理,是一次性拿5個就扔了.所以沒有處理過期,因為我這一個ip只能用幾次就封了),當ip失效後你需要將此ip從ip池中刪除。當ip不夠的時候又要引入新的ip新增到當前的ip池中。要動態維護ip池。
三:python3使用代理ip的方式:下文會介紹,以前我的python3使用代理ip也有格式,你爬取的是http用http,是https用https就行。
四:異常處理,再寫爬蟲的時候一定要對所有可能產生異常的操作進行try except的異常處理。異常又要注意是否為超時異常,還是ip不可用,過期的異常,還是操作dom樹的時候產生的異常。不同的異常要採用不同的策略。(可用狀態碼,全域性變數判斷)。
五:注意使用資訊和要求:我買的那個蘑菇代理不能請求頻率超過5s。還有就要有新增本地ip地址。(可能是基於安全考慮)
六:分析目標網站對ip的需求。你需要設定ip池的最小和請求ip的個數不至於太大或太小,可以預先測試。打個比方你爬的網站同一個時段10個ip更換就不夠了。你不至於開100個ip去爬吧,ip過期而沒咋麼用就是對資源的浪費(當然土豪請隨意。)

自行找一個,人家會給你api. 你呼叫即可.

我這裡用的是json格式的api

使用代理池用py完整的爬取一個網站

使用代理池用py完整的爬取一個網站

使用代理池用py完整的爬取一個網站

程式碼

1.配置環境,匯入包


from bs4 import BeautifulSoup
import requests
import random
 headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

2.獲取網頁內容函式

def getHTMLText(url,proxies):
    try:
        r = requests.get(url,proxies=proxies)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
    except:
        return 0
    else:
        return r.text

3.從代理ip網站獲取代理ip列表函式,並檢測可用性,返回ip列表

def get_ip_list(url):
    web_data = requests.get(url,headers)
    soup = BeautifulSoup(web_data.text, 'html')
    ips = soup.find_all('tr')
    ip_list = []
    for i in range(1, len(ips)):
        ip_info = ips[i]
        tds = ip_info.find_all('td')
        ip_list.append(tds[1].text + ':' + tds[2].text)
#檢測ip可用性,移除不可用ip:(這裡其實總會出問題,你移除的ip可能只是暫時不能用,剩下的ip使用一次後可能之後也未必能用)
    for ip in ip_list:
        try:
          proxy_host = "https://" + ip
          proxy_temp = {"https": proxy_host}
          res = urllib.urlopen(url, proxies=proxy_temp).read()
        except Exception as e:
          ip_list.remove(ip)
          continue
    return ip_list

4.從ip池中隨機獲取ip列表

def get_random_ip(ip_list):
    proxy_list = []
    for ip in ip_list:
        proxy_list.append('http://' + ip)
    proxy_ip = random.choice(proxy_list)
    proxies = {'http': proxy_ip}
    return proxies

5.呼叫代理

if __name__ == '__main__':
    url = 'http://www.xicidaili.com/nn/'
    ip_list = get_ip_list(url)
    proxies = get_random_ip(ip_list)
    print(proxies)

gitee.com/bobobobbb/proxy_scraby

本作品採用《CC 協議》,轉載必須註明作者和本文連結
感謝關注 上海PHP自學中心-免費程式設計視訊教學|

相關文章