抓取请求 URL 和响应 URL 是不同的


# -*- 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[]=منوعات_عن_الطبيعة

但是在列表值中,我得到

[
{
"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]是一个不同的数字,如果重复它,响应网址总是随机的,如果增加范围(1,3),随机

蜘蛛有什么问题?


我想要的是 ListURL 和ResponseURL中获得相同的结果,因为我在调用函数def parseresponse时发送了ListURL,但应该是listurl响应 URL完全不同。

>>> 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})

最新更新