Репликация поиска в JavaScript в scrapy - PullRequest
0 голосов
/ 09 января 2019

У меня нет успеха в очистке этого сайта, потому что он не содержит никаких форм.

Мой сканер всегда ничего не возвращает, когда я отправляю данные ответа в файл:

  import scrapy

class LoginSpider(scrapy.Spider):
    name = 'mamega.org'
    start_urls = ['https://www.mamega.org/search/']
    def parse(self, response):
        return scrapy.Request('https://www.mamega.org/_searchm.php',
                                method="POST",
                                meta = {'section': 'ebooks', 'datafill': 'musso'},
                                headers={'Content-Type': 'application/json; charset=UTF-8'}, 
                                callback = self.after_login
                                )



    def after_login(self, response):
        print ("__________________________________________after_login______________________________________________________")
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
           f.write(response.body)
           self.log('Saved file %s' % filename)
        for title in response.xpath('//table[@style="width:93%;"]//tbody//tr//td/following-sibling::a[2]/@href'):
            yield {'roman': title.css('a ::text').extract_first(),'url': title.css('a::attr(href)').extract_first()}

Ответы [ 2 ]

0 голосов
/ 10 января 2019
return scrapy.Request('https://www.mamega.org/_searchm.php',
                                method="POST",
                                meta = {'section': 'ebooks', 'datafill': 'musso'},
                                headers={'Content-Type': 'application/json; charset=UTF-8'}, 
                                callback = self.after_login
                                )

данные, которые вы передаете как мета, на самом деле formdata из POST запроса.

Сделайте ваш запрос как:

return scrapy.Request('https://www.mamega.org/_searchm.php',
                                method="POST",
          #formdata             formdata = {'section': 'ebooks', 'datafill': 'musso'},
                                headers={'Content-Type': 'application/json; charset=UTF-8'}, 
                                callback = self.after_login
                                )
0 голосов
/ 10 января 2019

Ваш первый запрос POST не содержит тела.

Если вы посмотрите на веб-сайт, вы увидите, что он включает в себя 3 вещи, которые необходимо скопировать для получения правильного ответа от их сервера:

enter image description here

Заголовки content-type и x-requested-with и тело типа form data.

Вы можете повторить это в своем сканере:

headers = {
    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 
    'x-requested-with': 'XMLHttpRequest' 
}
Request(
    'https://www.mamega.org/_searchm.php', 
    method='POST', 
    body='section=ebooks&datafill=musso', 
    headers=headers
}
...