Веб-сканер для обучения Python в основном разделен на три основных раздела: сканирование , анализ и хранение.
Кроме того, здесь, в конце, будет подробно описана более часто используемая среда сканирования Scrapy.
Во-первых, давайте перечислим соответствующие статьи, которые я суммировал и которые охватывают основные понятия и навыки, необходимые для начала работы с веб-сканерами: Маленькая станция Нин Гэ — веб-сканер.
Когда мы вводим URL-адрес в браузере и нажимаем Enter, что происходит в фоновом режиме? Например, если вы введете http://www.lining0806.com/, вы увидите домашнюю страницу веб-сайта брата Нина.
Проще говоря, этот процесс происходит в следующие четыре этапа:
Проще говоря, веб-сканер должен реализовать функции браузера. При указании URL-адреса необходимые пользователю данные возвращаются напрямую, без необходимости вручную манипулировать браузером для их получения шаг за шагом.
На этом этапе вам необходимо уточнить, какой контент вы хотите получить? Это исходный код HTML или строка в формате Json и т. д.
Большинство случаев сканирования — это запросы на получение, то есть получение данных непосредственно с сервера другой стороны.
Прежде всего, Python поставляется с двумя модулями, urllib и urllib2, которые в основном могут обеспечить обычное сканирование страниц. Кроме того, запросы — это тоже очень полезный пакет, похожий на этот, есть httplib2 и так далее.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
Кроме того, для URL-адресов с полями запроса запросы на получение обычно добавляют запрошенные данные к URL-адресу, чтобы разделить URL-адрес и передать данные. Несколько параметров связаны с помощью &.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
Ссылка по теме: Обзор сканирования рейтинга новостей NetEase
Эталонный проект: Самый простой сканер из веб-сканеров: сканирование рейтингов новостей NetEase.
2.1 Войдите через форму
Эта ситуация представляет собой почтовый запрос, то есть данные формы сначала отправляются на сервер, а затем сервер сохраняет возвращенный файл cookie локально.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Войдите в систему, используя файлы cookie
Используя файлы cookie для входа в систему, сервер будет считать, что вы вошедший в систему пользователь, поэтому вернет вам контент, вошедший в систему. Поэтому, если требуется код подтверждения, вы можете использовать файл cookie для входа в систему с кодом подтверждения.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
Если есть код подтверждения, в настоящее время невозможно использовать ответ = Requests_session.post(url=url_login, data=data). Метод должен быть следующим:
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
Ссылки, связанные с данной: Вход в систему с кодом проверки веб-сканером
Эталонный проект: имя пользователя, пароль и код подтверждения для веб-сканера: вход в систему: сканирование веб-сайта Zhihu
3.1 Использование прокси
Применимая ситуация: ограничение IP-адресов также может решить проблему необходимости ввода проверочного кода для входа в систему из-за «частых кликов».
В этом случае лучший способ — поддерживать пул IP-адресов прокси. В Интернете есть много бесплатных IP-адресов прокси, и есть много хороших и плохих. Вы можете найти те, которые можно использовать с помощью проверки. В случае «частых кликов» мы также можем избежать блокировки веб-сайта, ограничив частоту посещения веб-сайта сканерами.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 Установка времени
Применимая ситуация: ситуация с ограниченной частотой.
И Requests, и Urllib2 могут использовать функцию Sleep() библиотеки времени:
import time
time.sleep(1)
3.3 Маскироваться под браузер, или бороться с «антихотлинкингом»
Некоторые веб-сайты проверяют, действительно ли вы получаете к ним доступ через браузер или доступ к ним осуществляется автоматически с помощью компьютера. В данном случае плюс User-Agent показывает, что вы заходите через браузер. Иногда он также проверяет, включена ли информация о реферере и является ли ваш реферер законным, обычно плюс реферер.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
Нечего сказать.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
или
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
Таким образом, мы можем использовать multi_session или multi_open для сохранения сеанса или открытия, захваченного сканером.
Вот экспериментальное сравнение параллельного сканирования для Wall Street News: многопроцессное сканирование Python и однопоточное и многопоточное сканирование Java.
Ссылки по теме: Сравнение методов многопроцессных и многопоточных вычислений в Python и Java.
В случае «загрузить больше» используйте Ajax для передачи большого количества данных.
Как это работает: после загрузки исходного кода веб-страницы по URL-адресу веб-страницы программа JavaScript будет выполнена в браузере. Эти программы загружают больше контента и «заполняют» веб-страницу. Вот почему, если вы перейдете непосредственно к URL-адресу самой веб-страницы, вы не найдете фактического содержания страницы.
Здесь, если вы используете Google Chrome для анализа ссылки, соответствующей «Запросу» (метод: щелкните правой кнопкой мыши → Проверить элемент → Сеть → Очистить, нажмите «Загрузить больше», появится соответствующая ссылка GET и найдите Тип текста/ html, щелкните, чтобы просмотреть параметры получения. Или скопируйте URL-адрес запроса), зациклите процесс.
Selenium — инструмент автоматического тестирования. Он может управлять браузером, включая заполнение символов, щелчки мыши, получение элементов, переключение страниц и ряд операций. Короче говоря, Selenium может делать все, что может делать браузер.
Здесь приведен код, который использует селен для динамического получения информации о тарифах с Qunar.com после заданного списка городов.
Эталонный проект: Веб-сканер Selenium использует вход через прокси: Сканирование веб-сайта Qunar
Для ситуации, когда на сайте есть код подтверждения, у нас есть три способа:
Использование прокси и файлов cookie для входа в систему уже обсуждалось ранее. Теперь поговорим об идентификации кода подтверждения.
Вы можете использовать систему Tesseract-OCR с открытым исходным кодом для загрузки и распознавания изображений проверочных кодов, а также передачи распознанных символов в систему сканирования для имитации входа в систему. Конечно, вы также можете загрузить изображение проверочного кода на платформу кодирования для идентификации. В случае неудачи вы можете снова обновить идентификационный код подтверждения до успешного завершения.
Эталонный проект: Проект идентификации кода проверки, версия 1: Captcha1
При сканировании необходимо обратить внимание на две проблемы:
После сканирования просканированный контент анализируется. Какой бы контент вам ни был нужен, вы можете извлечь из него соответствующий контент.
Общие инструменты анализа включают регулярные выражения, BeautifulSoup, lxml и т. д.
После анализа того, что нам нужно, следующим шагом будет сохранение этого.
Мы можем сохранить его в текстовом файле, в базе данных MySQL или MongoDB и т. д.
При хранении необходимо обратить внимание на два вопроса:
Scrapy — это фреймворк Python с открытым исходным кодом, основанный на Twisted, который широко используется в промышленности.
Для получения сопутствующего контента вы можете обратиться к созданию веб-сканера на основе Scrapy. В то же время код проекта поискового сканирования WeChat, представленный в этой статье, приведен в качестве учебного пособия.
Эталонный проект: используйте Scrapy или Requests для рекурсивного сканирования результатов поиска WeChat.
Хороший веб-сканер должен сначала соответствовать протоколу роботов . Полное название протокола роботов (также известного как протокол сканирования, протокол роботов и т. д.) — «Протокол исключения роботов». Веб-сайты используют протокол роботов, чтобы сообщать поисковым системам, какие страницы можно сканировать, а какие нет.
Поместите текстовый файл robots.txt (например, https://www.taobao.com/robots.txt) в корневой каталог веб-сайта. В нем вы можете указать страницы, к которым могут обращаться различные веб-сканеры, и страницы, к которым они могут получить доступ. доступ к указанным страницам определяется обычными правилами представления выражений. Прежде чем поисковый робот соберет этот веб-сайт, он сначала получает текстовый файл robots.txt, затем анализирует содержащиеся в нем правила, а затем собирает данные веб-сайта в соответствии с правилами.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
Примечание. Английское слово должно быть написано с заглавной буквы. Двоеточие указывается на английском языке. После двоеточия указывается весь веб-сайт.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /