import scrapy
from ..items import dealItem
class FarmtoolsSpider(scrapy.Spider):
name = 'farmtools'
allowed_domains = ['www.deal.ie']
start_urls = ['https://www.deal.ie/all?source=private&sort=publishdate%20desc']
def parse(self, response):
items = dealItem()
rows = response.xpath('//ul[@class="card-collection"]/li')
for row in rows:
link = row.xpath('.//a/@href').get() #this is the full link.
link_split = link.split('/')[-1] #this splits the url link th first time.
linkid = link_split.split('?')[0] #this splits it the second time.
title = row.xpath('.//div[1]/p[@class="card__body-title"]/text()').get()
county = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/following-sibling::node()/text()').get()
price = row.xpath('.//p[@class="card__price"]/span[1]/text()').get()
subcat = row.xpath('.//a/div/div[2]/div[1]/p[2]/text()[2]').get()
zero = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/text()').get()
if zero == '0 min':
items['linkid'] = linkid
items['title'] = title
items['county'] = county
items['price'] = price
items['subcat'] = subcat
items['zero'] = zero
items['link'] = link
yield response.follow(url=link,
callback=self.parse_item_page,
cb_kwargs={link: items})
def parse_item_page(self, response, link):
items = DonedealItem()
rows = response.xpath('//html/body/main/div/div[1]/div')
for row in rows:
views = row.xpath('.//div[2]/div[2]/div[1]/div[3]/div[1]/div/div[1]/div/div/span[2]/text()').get()
seller_id = row.xpath('.//div[2]/div[2]/div[2]/div[3]/div/div[1]/div[1]/div[2]/a/@href').get()
seller_ads = row.xpath('.//div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[3]/dd/text()').get()
lifetime_ads = row.xpath('//div[2]/div[2]/div[2]/div[3]/div/div[2]/div/dl[4]/dd/text()').get()
items['views'] = views
items['seller_id'] = seller_id
items['seller_ads'] = seller_ads
items['lifetime_ads'] = lifetime_ad
items['views'] = views
yield{
items
}
第一个解析方法运行良好,但我不确定是否正确编写了第二个解析方法
第一个解析方法的一部分会刮取我想要遵循的特定链接,以便我可以从中刮取额外的数据
我想要实现的是从第一个解析方法中获取链接,从中获取其他项值,然后将它们作为项添加到一起
我还向两者添加了items = DonedealItem()
,但我不确定这是否正确
当我现在运行它时,我得到了:File“/home/william/.local/lib/python3.7/site packages/twisted/internet/defer.py”,第654行,_runcallbackscurrent.result=callback(current.result,*args,**kw)类型错误:parse_item_page()得到了一个意外的关键字参数“donedeal.ie/cars for sale/e39-520i-for-breaking-alling-have-lsd/…”。我得到的每一个链接是刮一个。我想做的是在我从第一个解析方法抓取的信息中添加更多信息,如“卖家id”、“视图”等。希望这有帮助
任何帮助都将不胜感激,谢谢
我可以发现您的代码存在一些问题,包括您在评论中提到的错误的原因,但是问题仍然存在,因为我不完全理解您想要删除的数据结构。
在
parse
方法中,在items
变量中实例化一个DonedealItem()
对象。然后尝试将其作为回调参数(cb_-kwargs)发送到回调函数(parse_item_page
)这里的问题是
link
是一个具有不可预测值的变量(当您将其设置为url时),它需要是一个与回调函数中定义的值相同的字符串。因此,这应该可以解决错误:但是,您的
parse_item_page
方法没有使用link
进行任何操作。相反,它实例化一个新的DonedealItem()
,用解析到这个方法中的数据填充它,然后生成它。作为link
参数接收的数据未被使用。如果要增加第一个parse
方法发送给您的数据,您需要使用它:这是一个提示:不需要这些花括号:
改用
yield items
仍然存在的问题:
DonedealItem
视为一个dict,您的代码所做的是先实例化项,然后运行for循环,并在该循环的每次迭代中覆盖项内的数据。我相信您应该在for循环中实例化您的项,但我不能确定,因为我不知道预期的结果是什么,也不知道DonedealItem
是如何定义的。即使如此,这仍然会导致第二个解析方法出现问题,因为它接收一个项,然后再次迭代。也许你需要使用列表李>相关问题 更多 >
编程相关推荐