Давайте возьмем пример, приведенный в документации Scrapy
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('small.author::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
Ну, это хорошо работает, но, как вы уже знаете, это не так для всех веб-сайтов, таких как amazon.com
Вам необходимо отправить пользовательский агент, такой как (Mozilla или Chrome) в заголовке запроса, и таким образом он узнает, что запрос поступает из браузера. Вы можете легко изменить его в настройках, заменив USER_AGENT = "Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 51.0.2704.103 Safari / 537.36".
Теперь вы изменили пользовательский агент, и сервер Amazon будет чувствовать, что запрос поступает из браузера Chrome. На шаг вперед вы увеличиваете параллелизм до некоторого большого числа, например 100. Теперь, что происходит, amazon может легко отследить вашего бота, и вы получите бан, потому что это означает, что одно устройство обращается к серверу 100 раз в секунду , что невозможно человеку.
Итак, здесь происходит ротация прокси и пользовательского агента. Вопрос в том, как мы их вращаем.
Допустим, у вас есть набор USER_AGENTS = [...] в настройках
middlewares.py
из .settings import USER_AGENT_LIST
импортировать случайный
из журнала импорта скрапа
class UserAgentRotationMiddleware(object):
def process_request(self, request, spider):
agent = random.choice(USER_AGENT_LIST)
if agent:
request.headers.setdefault('User-Agent', agent)
И вы должны сказать, что проект Scrapy, как,
DOWNLOADER_MIDDLEWARES = {
"yourproject.middlewares.UserAgentRotationMiddleware": 500
}
Что на самом деле происходит, когда вы запускаете паука?
Пояснение:
- Запрос графиков терапии.
- URL поступает в промежуточное ПО загрузчика до того, как запрос достигает сервера
Технически это вызовет класс промежуточного программного обеспечения загрузчика. Он вызывает метод process_request с предоставлением текущего объекта запроса и объекта паука
def process_request(self, request, spider):
Теперь объект запроса доступен для вас, вы можете делать с ним все что угодно, например, менять прокси заголовков, даже URL-адрес. но сейчас мы сосредоточены на пользовательском агенте.
поэтому по нашему алгоритму мы изменим пользовательский агент,
# Choosing random user agent from a list
agent = random.choice(USER_AGENT_LIST)
if agent:
request.headers.setdefault('User-Agent', agent)
Опять новый запрос получает расписание для этого промежуточного ПО, оно изменит пользовательский агент и передаст объект запроса вперед.
DOWNLOADER_MIDDLEWARES = {
"yourproject.middlewares.UserAgentRotationMiddleware": 500
}
При регистрации нашего проекта мы должны указать некоторое число от 100 до 900,
какие 500 это указывает? (в качестве значения пространства имен промежуточного программного обеспечения)
Существует множество различных промежуточных программ, уже существующих в scrapy, и мы можем определить их так, как мы хотим сейчас, в таком случае.
как их расставить по приоритетам?
какой будет порядок их исполнения?
Выполняется в порядке возрастания, например, 100, 200, 230, 500, 650, 900.
Такая же методология применяется для ротации прокси.
Запрос:
Если вы использовали urllib более низкого уровня или модуль запросов, что он делает?
Он принимает URL в качестве аргумента (куки, прокси, заголовки, необязательные аргументы полезной нагрузки)
Когда вы запускаете его, что он делает?
Это делает http запрос к URL "http://quotes.toscrape.com"
Как обычно в браузере:
- Откройте браузер.
- Введите "http://quotes.toscrape.com" в строке URL
- Ваш браузер показывает этот сайт
Но многое происходит между шагами 2 и 3.
Ваш браузер принимает URL-запросы к серверу, используя HTTP-запрос более низкого уровня. принимает ответ, затем компилирует его и отображает в браузере.
Псевдокод, который делает то же самое,
import requests
response = requests.get('http://quotes.toscrape.com')
print response.status_code
print response.content
reports.get на URL "http://quotes.toscrape.com"
отправьте HTTP-запрос GET на "http://quotes.toscrape.com", который возвращает вам ответ. вы можете выполнить его и проверить его, он вернет нам некоторый html , который является ничем иным, как ответом .
То, что делает scrapy, чтобы просто обеспечить свою функциональность, оборачивает этот модуль запросов в scrapy.Request и модуль ответа HttpResponse.
HttpResponse предлагает xpath & css селектор.
def parse(self, response):
response.xpath('....')
ответ, предоставленный платформой scrapy в этом методе синтаксического анализа, является экземпляром HttpResponse, который является оболочкой объекта ответа более низкого уровня urllib.