scrapy请求网址和响应网址不同

时间:2019-05-21 22:35:50

标签: python scrapy

# -*- 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 总是随机的,如果增加 range(1,3)

蜘蛛有什么问题?


我想在 listurl responseurl 中获得相同的结果,因为我在调用函数{{1时发送了 listurl }},但假定为 listurl responseurl 完全不同。

1 个答案:

答案 0 :(得分:1)

>>> 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[]=أطباق_رئيسية'

编辑

对不起,我以为您在抱怨编码,但真正的问题是数字,对吗?

问题在于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})