# -*- 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 完全不同。
答案 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})