URL запроса scrapy и URL ответа различаются - PullRequest
0 голосов
/ 22 мая 2019
# -*- coding: utf-8 -*-
import scrapy
from urllib.parse import unquote, quote

class md3(scrapy.Spider):
    name = "md3"
    allowed_domains = ["mawdoo3.com"]
    start_urls = ["https://mawdoo3.com"]

    def parse(self, response):
        for listing in response.css("ul.category-items > li"):
            lister = {}
            namelist = listing.css("a::text").extract_first()

            for i in range(1, 8):
                listurl = "https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]="+str(i)+"&rsargs[]="+str(namelist.replace(" ", "_"))

                lister['listurl'] = listurl
                yield scrapy.Request(url=listurl, callback=self.parseresponse, meta={"lister": lister})

    def parseresponse(self, response):
        response.meta.get("lister")['responseurl'] = unquote(response.url)

        yield response.meta.get("lister")

этот паук должен получать данные по ссылке, такой как

https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]=1&rsargs[]=منوعات_عن_الطبيعة

, но в значении lister я получаю

[
  {
    "listurl" = "https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]=2&rsargs[]=منوعات_عن_الطبيعة",
    "responseurl" = "https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]=1&rsargs[]=%D8%B2%D8%B1%D8%A7%D8%B9%D8%A9_%D8%A7%D9%84%D8%AE%D8%B6%D8%B1%D8%A7%D9%88%D8%A7%D8%AA_%D9%88%D8%A7%D9%84%D9%81%D9%88%D8%A7%D9%83%D9%87"
  }
]

при декодировании rsargs [1] становится совершенно другим именем, чем listurl и rsargs [0] - это другое число, а если его повторить, responseurl всегда случайный и более случайный, если увеличить диапазон (1, 3)

в чем проблема с пауком?


что я хочу получитьте же самые результаты в listurl и responseurl , потому что я отправил listurl в вызове функции def parseresponse, но responseurl , который предполагаетсяне будет listurl совершенно другой.

1 Ответ

1 голос
/ 22 мая 2019
>>> from urllib.parse import unquote                                                                                                                                           
>>> response.url                                                                                                                                                               
'https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]=1&rsargs[]=%D8%A3%D8%B7%D8%A8%D8%A7%D9%82_%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9'
>>> unquote(response.url)                                                                                                                                                      
'https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]=1&rsargs[]=أطباق_رئيسية'

EDIT

Извините, я думал, что вы жалуетесь на кодировку, но реальный вопрос был о числах, верно?

Проблема в том, что lister = {} находится вне внутреннего цикла for. Таким образом, вы передаете одну и ту же ссылку на объект обратным вызовам, но продолжаете обновлять ее. Быстрое исправление будет:

for i in range(1, 8):
    listurl = "https://mawdoo3.com/index.php?action=ajax&rs=JsonCategories&rsargs[]="+str(i)+"&rsargs[]="+str(namelist.replace(" ", "_"))

    lister{}
    lister['listurl'] = listurl
    yield scrapy.Request(url=listurl, callback=self.parseresponse, meta={"lister": lister})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...