2015-11-24 2 views
2

Я пытаюсь сделать некоторое извлечение с помощью scrapy, но он не возвращает ожидаемый html, я не знаю, в чем проблема, если это может быть безопасность сайта или что-то еще , потому что другие страницы возвращают правильный результат.Scraw crawler не возвращает ожидаемый html

Я пытаюсь извлечь список сообщений по этой ссылке http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2, что касается неудовлетворенности клиентов услугами и продуктами, но html, возвращенный с помощью приведенного выше кода, не содержит список сообщений, просто простой html почти пустой.

Кто-нибудь знает, что может случиться? Проблема, вызывающая блокировку правильного извлечения?

код прост, это то же самое с Scrapy учебника:

Я уже пробовал некоторые гусеничный настольный компьютер или онлайн-инструментов, а результат тот же.

import scrapy 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["reclameaqui.com.br"] 
    start_urls = [ 
     "http://www.reclameaqui.com.br/busca/q=estorno&empresa=Netshoes&pagina=2" 
    ] 

    def parse(self, response): 
     filename = response.url.split("/")[-2] + '.html' 
     with open(filename, 'wb') as f: 
      f.write(response.body) 

ответ

3

Прежде всего, у вас есть ошибка в вашем start_urls. Заменить:

start_urls = [ 
    "http://www.reclameaqui.com.br/busca/q=estorno&empresa=Netshoes&pagina=2" 
] 

с:

start_urls = [ 
    "http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2" 
] 

Кроме того, если бы вы проверить источник ответа, вы увидите еще несколько проблем, вам необходимо преодолеть:

  • есть a form, который необходимо представить для продолжения
  • Форма ввода значения вычисляются с помощью JavaScript
  • HTML, сам сломана - form немедленно закрывается, а затем входы приходят:

    <body> 
    <form method="POST" action="%2fbusca%2f%3fq%3destorno%26empresa%3dNetshoes%26pagina%3d2"/> 
    <input type="hidden" name="TS01867d0b_id" value="3"/><input type="hidden" name="TS01867d0b_cr" value=""/> 
    <input type="hidden" name="TS01867d0b_76" value="0"/><input type="hidden" name="TS01867d0b_86" value="0"/> 
    <input type="hidden" name="TS01867d0b_md" value="1"/><input type="hidden" name="TS01867d0b_rf" value="0"/> 
    <input type="hidden" name="TS01867d0b_ct" value="0"/><input type="hidden" name="TS01867d0b_pd" value="0"/> 
    </form> 
    </body> 
    

Первая проблема легко решается с помощью FormRequest.from_response(). Второй - более серьезная проблема, и вы можете уйти с реальным браузером (смотрите selenium). Я попытался использовать ScrapyJS, но не смог его решить. Третья проблема, если не переключиться на использование реального браузера, может быть решена путем разрешения BeautifulSoup и lenient html5lib parser для исправления HTML.

Вот вышеназванные идеи в Python/Scrapy (не работает - получение Connection to the other side was lost in a non-clean fashion ошибки - я подозреваю, что не все параметры входных значений/POST рассчитывалось):

from bs4 import BeautifulSoup 
import scrapy 


class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    start_urls = [ 
     "http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2" 
    ] 

    def start_requests(self): 
     for url in self.start_urls: 
      yield scrapy.Request(url, self.parse_page, meta={ 
       'splash': { 
        'endpoint': 'render.html', 
        'args': {'wait': 0.8} 
       } 
      }) 

    def parse_page(self, response): 
     soup = BeautifulSoup(response.body, "html5lib") 
     response = response.replace(body=soup.prettify()) 

     return scrapy.FormRequest.from_response(response, 
               callback=self.parse_form_request, 
               url="http://www.reclameaqui.com.br/busca/?q=estorno&empresa=Netshoes&pagina=2", 
               headers={ 
                "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 
               }) 

    def parse_form_request(self, response): 
     print(response.body) 

Более подробной информации о selenium и ScrapyJS настройка, см:

Кроме того, м Убедитесь, что вы следуете правилам, описанным на странице Terms of Use.

+0

Отличное объяснение – Ryan

+0

спасибо, это очень поможет началу моей работы, я постараюсь заставить ее работать – Guthierrez

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