2015-06-12 2 views
4

Я пытаюсь загрузить данные из gsmarena. Пример кода для загрузки HTC one me spec представлен на следующем сайте «http://www.gsmarena.com/htc_one_me-7275.php», как указано ниже:Избегайте запрета на сайтах с использованием scrapy

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

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 shell, используя:

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

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

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

ответ

3

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

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

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

На самом деле, ваш USER_AGENT вероятно, может быть anyone related to a browser

+1

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

2

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

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

2

Чтобы добавить в историю «Установка реального User-Agent и делая вид, что реальный браузер», вот Связующее ПО, которое я загрузил на GitHub:

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


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

Смежные вопросы