Слышали, что вашего гада заблокировали?

Python рептилия

Если вы столкнулись с сообщением «Ваш запрос слишком частый, повторите попытку позже» во время процесса сканирования или если код полностью правильный, но внезапно к нему нельзя получить доступ во время процесса сканирования, то поздравляем, ваш сканер был обнаружен другой стороной, в свете дружеского оперативного предупреждения ваш ip может быть забанен в серьезных случаях, поэтому прокси ip особенно важен. Сегодня мы поговорим об IP-адресе прокси для решения проблемы блокировки сканера.

В Интернете есть множество IP-адресов прокси, бесплатных и платных. Большинство сканеров компаний покупают эти профессиональные версии.Для обычных людей бесплатные в основном удовлетворяют наши потребности, но у бесплатных есть недостаток, своевременность не сильна и нестабильна, поэтому нам нужно выполнить простой процесс на собранном ip. проверять.

1. Сбор мишеней

Эта статья в основном направлена ​​наАгент Вест Торн, Этот сайт использовался давно, но в то время он также предоставлял бесплатный API, а сейчас API недоступен, мы напишем простой краулер для сбора.

Открываем прокси west thorn, там несколько страниц, решительно выбираем высокий скрытый прокси.

Браузер Chrome правый клик для проверки сети, не сложно найти что каждый ip адрес находится в теге td, что для нас намного проще Первоначальная идея получить все ips, потом проверить наличие, и удалить их, если они недоступны.

image.png

  • Определить правила сопоставления
import re

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

2. Проверьте здесь. Я использую библиотеку IP-адресов Taobao, чтобы проверить доступность

2.1. О базе данных IP-адресов Taobao

В настоящее время предоставляемые услуги включают в себя: 1. В соответствии с IP-адресом, предоставленным пользователем, быстро запросите географическую информацию и географическую информацию об IP-адресе, включая страну, провинцию, город и оператора. 2. Пользователи могут обновлять содержимое наших услуг в соответствии со своим местоположением и IP-адресом. Наше преимущество: 1. Предоставление исчерпывающей информации о странах, провинциях, городах, округах и операторах с широкими информационными размерами и стандартизированными форматами. 2. Предоставлять полные отчеты статистического анализа, точность по провинциям превышает 99,8%, точность по городу превышает 96,8%, а качество данных гарантируется.

2.2 Описание интерфейса

  1. Интерфейс запроса (GET):IP Taobao.com/service/individual…пример:http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44
  2. Информация об ответе: (в формате json) страна, провинция (автономная область или муниципалитет), город (округ), оператор
  3. Формат возвращаемых данных:
{"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"}}

Смысл значения кода: 0: успех, 1: сбой.

Примечание: Для обеспечения нормальной работы сервиса частота доступа каждого пользователя должна быть менее 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. Код

В код добавлена ​​обработка исключений. Фактически, вы можете написать свою собственную демонстрацию с обработкой исключений или без нее. Однако для облегчения отладки другими пользователями рекомендуется добавить обработку исключений там, где могут возникать исключения.

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: 采集的页数
    :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规则
            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("请输入需要采集的页数:")
    ip_parse_xici(page=xici_pg)

Запустите код:

日志

4. Добавьте IP-адрес прокси в свой поисковый робот

Предлагается хранить собранный ip в базе, чтобы можно было вызывать его напрямую каждый раз при вызове краулера.Кстати как добавить 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)

Что ж, мама больше не беспокоится о том, что моего гада заблокируют

Категории