Избегайте бана на сайтах, использующих scrapy

Пытаюсь скачать данные с gsmarena. Пример кода для загрузки спецификации HTC one me взят со следующего сайта "http://www.gsmarena.com/htc_one_me-7275.php", как указано ниже:

Данные на веб-сайте классифицируются в виде таблиц и строк таблиц. Данные имеют формат:

table header > td[@class='ttl'] > td[@class='nfo']

Файл Items.py:

import scrapy

class gsmArenaDataItem(scrapy.Item):
    phoneName = scrapy.Field()
    phoneDetails = scrapy.Field()
    pass

Файл паука:

from scrapy.selector import Selector
from scrapy import Spider
from gsmarena_data.items import gsmArenaDataItem

class testSpider(Spider):
    name = "mobile_test"
    allowed_domains = ["gsmarena.com"]
    start_urls = ('http://www.gsmarena.com/htc_one_me-7275.php',)

    def parse(self, response):
        # extract whatever stuffs you want and yield items here
        hxs = Selector(response)
        phone = gsmArenaDataItem()
        tableRows = hxs.css("div#specs-list table")
        for tableRows in tableRows:
            phone['phoneName'] = tableRows.xpath(".//th/text()").extract()[0]
            for ttl in tableRows.xpath(".//td[@class='ttl']"):
                ttl_value = " ".join(ttl.xpath(".//text()").extract())
                nfo_value = " ".join(ttl.xpath("following-sibling::td[@class='nfo']//text()").extract())
                colonSign = ": "
                commaSign = ", "
                seq = [ttl_value, colonSign, nfo_value, commaSign]
                seq = seq.join(seq)
        phone['phoneDetails'] = seq
        yield phone

Однако меня банят, как только я пытаюсь даже загрузить страницу в оболочке scrapy, используя:

"http://www.gsmarena.com/htc_one_me-7275.php"

Я даже пытался использовать DOWNLOAD_DELAY = 3 в settings.py.

Пожалуйста, предложите, как мне поступить.


person ajhavery    schedule 12.06.2015    source источник


Ответы (3)


Вероятно, это происходит из-за пользовательского агента Scrapy. Как вы можете видеть здесь, переменная BOT_NAME используется для составления USER_AGENT . Я предполагаю, что сайт, который вы хотите просканировать, блокирует это. Я попытался просмотреть их файл robots.txt, но ничего не понял.

Вы можете попробовать настроить собственный UserAgent. В settings.py добавьте следующую строку:

USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"

На самом деле, ваш USER_AGENT, вероятно, может быть любым, имеющим отношение к браузеру.

person FBidu    schedule 12.06.2015
comment
Интересно... Я пытался поиграть с веб-сайтом с помощью переключателя UserAgent, и теперь я вообще не могу загрузить ни одну страницу! Этот сайт, вероятно, имеет очень строгую политику блокировки пользователей по их IP-адресам, если они появляются с любым типом UserAgent, который обозначает сканер, поэтому вы не сможете загрузить его какое-то время. - person FBidu; 12.06.2015

Чтобы добавить к истории «Установка настоящего агента пользователя и притворство настоящего браузера», вот промежуточное программное обеспечение, которое я загрузил на github:

Он основан на fake-useragent пакете и использует разные случайные User-Agent заголовки для каждого запроса на основе реальная статистика использования браузера.


Также убедитесь, что вы не нарушаете никаких правил или условий использования веб-сайта. Смотрите также:

person alecxe    schedule 12.06.2015

Если сайт явно не хочет парсинга вообще, разработка нового обходного пути только отсрочит неизбежное — они добавят новое правило, чтобы предотвратить ваш новый трюк, и вы вернетесь к исходной точке.

Поговорите с администратором сайта — если они не запрещают парсинг только для того, чтобы усложнить жизнь другим (как это делают некоторые коммерческие организации), у них может быть хорошая альтернатива, такая как API или (платный?) канал, на который вы можете подписаться.

person tripleee    schedule 12.06.2015