欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解爬蟲被封的問題

 更新時間:2019年04月23日 14:32:19   作者:一只寫程序的猿  
這篇文章主要介紹了爬蟲被封的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

如果你在爬蟲過程中有遇到“您的請求太過頻繁,請稍后再試”,或者說代碼完全正確,可是爬蟲過程中突然就訪問不了,那么恭喜你,你的爬蟲被對方識破了,輕則給予友好提示警告,嚴(yán)重的可能會對你的ip進(jìn)行封禁,所以代理ip那就尤為重要了。今天我們就來談一下代理IP,去解決爬蟲被封的問題。

網(wǎng)上有許多代理ip,免費(fèi)的、付費(fèi)的。大多數(shù)公司爬蟲會買這些專業(yè)版,對于普通人來說,免費(fèi)的基本滿足我們需要了,不過免費(fèi)有一個弊端,時效性不強(qiáng),不穩(wěn)定,所以我們就需要對采集的ip進(jìn)行一個簡單的驗證。

1.目標(biāo)采集

本文主要針對西刺代理,這個網(wǎng)站很早之前用過,不過那個時候它還提供免費(fèi)的api,現(xiàn)在api暫不提供了,我們就寫個簡單的爬蟲去采集。

打開西刺代理,有幾個頁面,果斷選擇高匿代理。

Chrome瀏覽器右鍵檢查查看network,不難發(fā)現(xiàn),每個ip地址都在td標(biāo)簽中,對于我們來說就簡單許多了,初步的想法就是獲取所有的ip,然后校驗可用性,不可用就剔除。

 

 定義匹配規(guī)則

import re

ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP
port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口

 2.校驗 這里我使用淘寶ip地址庫檢驗可用性

2.1、關(guān)于淘寶IP地址庫

目前提供的服務(wù)包括:

  1. 1. 根據(jù)用戶提供的IP地址,快速查詢出該IP地址所在的地理信息和地理相關(guān)的信息,包括國家、省、市和運(yùn)營商。
  2. 2. 用戶可以根據(jù)自己所在的位置和使用的IP地址更新我們的服務(wù)內(nèi)容。

我們的優(yōu)勢:

  1. 1. 提供國家、省、市、縣、運(yùn)營商全方位信息,信息維度廣,格式規(guī)范。
  2. 2. 提供完善的統(tǒng)計分析報表,省準(zhǔn)確度超過99.8%,市準(zhǔn)確度超過96.8%,數(shù)據(jù)質(zhì)量有保障。

2.2、接口說明

請求接口(GET):
ip.taobao.com/service/get…
例:http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44
響應(yīng)信息:
(json格式的)國家 、?。ㄗ灾螀^(qū)或直轄市)、市(縣)、運(yùn)營商
返回數(shù)據(jù)格式:

{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}

其中code的值的含義為,0:成功,1:失敗。
注意:為了保障服務(wù)正常運(yùn)行,每個用戶的訪問頻率需小于10qps。
我們先通過瀏覽器測試一下

輸入地址http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44

再次輸入一個地址http://ip.taobao.com/service/getIpInfo2.php?ip=112.85.168.98

代碼操作

import requests

check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip="
api = check_api + ip
try:
  response = requests.get(url=api, headers=api_headers, timeout=2)
  print("ip:%s 可用" % ip)
except Exception as e:
  print("此ip %s 已失效:%s" % (ip, e))

 3.代碼
代碼中加入了異常處理,其實自己手寫的demo寫不寫異常處理都可以,但是為了方便其他人調(diào)試,建議在可能出現(xiàn)異常的地方加入異常處理。

import requests
import re
import random

from bs4 import BeautifulSoup

ua_list = [
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
  "Mozilla / 5.0(Windows NT 6.1;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 45.0.2454.101Safari / 537.36"
  ]


def ip_parse_xici(page):
  """

  :param page: 采集的頁數(shù)
  :return:
  """
  ip_list = []
  for pg in range(1, int(page)):
    url = 'http://www.xicidaili.com/nn/' + str(pg)
    user_agent = random.choice(ua_list)
    my_headers = {
      'Accept': 'text/html, application/xhtml+xml, application/xml;',
      'Accept-Encoding': 'gzip, deflate, sdch',
      'Accept-Language': 'zh-CN,zh;q=0.8',
      'Referer': 'http: // www.xicidaili.com/nn',
      'User-Agent': user_agent
    }
    try:
      r = requests.get(url, headers=my_headers)
      soup = BeautifulSoup(r.text, 'html.parser')
    except requests.exceptions.ConnectionError:
      print('ConnectionError')
    else:
      data = soup.find_all('td')
      # 定義IP和端口Pattern規(guī)則
      ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP
      port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口
      ips = re.findall(ip_compile, str(data)) # 獲取所有IP

      ports = re.findall(port_compile, str(data)) # 獲取所有端口
      check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip="

      for i in range(len(ips)):
        if i < len(ips):
          ip = ips[i]
          api = check_api + ip
          api_headers = {
            'User-Agent': user_agent
          }
          try:
            response = requests.get(url=api, headers=api_headers, timeout=2)
            print("ip:%s 可用" % ip)
          except Exception as e:
            print("此ip %s 已失效:%s" % (ip, e))
            del ips[i]
            del ports[i]
      ips_usable = ips
      ip_list += [':'.join(n) for n in zip(ips_usable, ports)] # 列表生成式
      print('第{}頁ip采集完成'.format(pg))
  print(ip_list)


if __name__ == '__main__':
  xici_pg = input("請輸入需要采集的頁數(shù):")
  ip_parse_xici(page=xici_pg)

運(yùn)行代碼:

4.為你的爬蟲加入代理ip

建議大家可以把采集的ip存入數(shù)據(jù)庫,這樣每次爬蟲的時候直接調(diào)用即可,順便提一下代碼中怎么加入代理ip。

import requests

url = 'www.baidu.com'
headers = {
  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
}
proxies = {
  "http": "http://111.177.181.44:9999",
  # "https": "https://111.177.181.44:9999",
}

res = requests.get(url=url, headers=headers, proxies=proxies)

好了,媽媽再也不擔(dān)心我爬蟲被封了

以上所述是小編給大家介紹的爬蟲被封的問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python使用BeautifulSoup解析并獲取圖片的實戰(zhàn)分享

    Python使用BeautifulSoup解析并獲取圖片的實戰(zhàn)分享

    這篇文章主要介紹了Python使用BeautifulSoup解析并獲取圖片的實戰(zhàn)分享,文中通過代碼和圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Python基礎(chǔ)之函數(shù)嵌套知識總結(jié)

    Python基礎(chǔ)之函數(shù)嵌套知識總結(jié)

    今天帶大家回顧python基礎(chǔ)知識,文中對Python函數(shù)嵌套作了非常詳細(xì)的知識總結(jié),對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法

    Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法

    今天小編就為大家分享一篇Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python人民幣小寫轉(zhuǎn)大寫輔助工具

    python人民幣小寫轉(zhuǎn)大寫輔助工具

    這篇文章主要為大家詳細(xì)介紹了python人民幣小寫轉(zhuǎn)大寫輔助工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 用Python寫一個簡易版彈球游戲

    用Python寫一個簡易版彈球游戲

    這篇文章主要介紹了用Python寫一個簡易版彈球游戲,文中有很多實用代碼,對正在學(xué)習(xí)python的小伙伴們有很大的幫助.需要的朋友可以參考下
    2021-04-04
  • Python使用Rich?type和TinyDB構(gòu)建聯(lián)系人通訊錄

    Python使用Rich?type和TinyDB構(gòu)建聯(lián)系人通訊錄

    這篇文章主要為大家介紹了Python使用Rich?type和TinyDB構(gòu)建聯(lián)系人通訊錄應(yīng)用程序,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Python遞歸實現(xiàn)猴子吃桃問題及解析

    Python遞歸實現(xiàn)猴子吃桃問題及解析

    這篇文章主要介紹了Python遞歸實現(xiàn)猴子吃桃問題及解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python不要再使用while死循環(huán),定時器代替效果更佳

    Python不要再使用while死循環(huán),定時器代替效果更佳

    在python開發(fā)的過程中,經(jīng)常見到小伙伴直接使用while True的死循環(huán)+sleep的方式來保存程序的一直運(yùn)行。這種方式雖然能達(dá)到效果,但是說不定什么時候就直接崩潰了,其實使用定時器效果也不錯哦
    2023-03-03
  • Python集成測試提高軟件質(zhì)量關(guān)鍵步驟探究

    Python集成測試提高軟件質(zhì)量關(guān)鍵步驟探究

    Python是一門強(qiáng)大的編程語言,提供了眾多工具和庫,用于執(zhí)行高效的集成測試,本文將深入介紹Python集成測試的概念、方法和最佳實踐,并通過豐富的示例代碼演示如何提高軟件質(zhì)量和減少潛在的缺陷
    2024-01-01
  • python獲取100以內(nèi)的質(zhì)數(shù)3種方式總結(jié)

    python獲取100以內(nèi)的質(zhì)數(shù)3種方式總結(jié)

    質(zhì)數(shù)也稱為質(zhì)數(shù),具有無限個,質(zhì)數(shù)定義為大于1的自然數(shù),除了1和它本省外沒有其他因數(shù)的數(shù)稱為質(zhì)數(shù),這篇文章主要給大家介紹了關(guān)于python獲取100以內(nèi)質(zhì)數(shù)的3種方式,需要的朋友可以參考下
    2024-08-08

最新評論