Python 从已删除的URL中删除信息
我是scrapy的新手,目前正在学习如何从一个被删除的URL列表中删除信息。我已经能够通过浏览scrapy网站上的教程从url中获取信息。然而,即使在谷歌在线搜索解决方案之后,我也面临着从一个url中抓取的url列表中抓取信息的问题 我在下面编写的scraper能够从第一个url中进行刮取。但是,它无法从已删除的URL列表中删除。问题从以下URL(self,response)的def parse_开始:因此我无法从已删除的URL列表中删除 有人能帮忙解决这个问题吗?先谢谢你Python 从已删除的URL中删除信息,python,scrapy,Python,Scrapy,我是scrapy的新手,目前正在学习如何从一个被删除的URL列表中删除信息。我已经能够通过浏览scrapy网站上的教程从url中获取信息。然而,即使在谷歌在线搜索解决方案之后,我也面临着从一个url中抓取的url列表中抓取信息的问题 我在下面编写的scraper能够从第一个url中进行刮取。但是,它无法从已删除的URL列表中删除。问题从以下URL(self,response)的def parse_开始:因此我无法从已删除的URL列表中删除 有人能帮忙解决这个问题吗?先谢谢你 import scr
import scrapy
from scrapy.http import Request
class SET(scrapy.Item):
title = scrapy.Field()
open = scrapy.Field()
hi = scrapy.Field()
lo = scrapy.Field()
last = scrapy.Field()
bid = scrapy.Field()
ask = scrapy.Field()
vol = scrapy.Field()
exp = scrapy.Field()
exrat = scrapy.Field()
exdat = scrapy.Field()
class ThaiSpider(scrapy.Spider):
name = "warrant"
allowed_domains = ["marketdata.set.or.th"]
start_urls = ["http://marketdata.set.or.th/mkt/stocklistbytype.do?market=SET&language=en&country=US&type=W"]
def parse(self, response):
for sel in response.xpath('//table[@class]/tbody/tr'):
item = SET()
item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
item['open'] = sel.xpath('td[3]/text()').extract()
item['hi'] = sel.xpath('td[4]/text()').extract()
item['lo'] = sel.xpath('td[5]/text()').extract()
item['last'] = sel.xpath('td[6]/text()').extract()
item['bid'] = sel.xpath('td[9]/text()').extract()
item['ask'] = sel.xpath('td[10]/text()').extract()
item['vol'] = sel.xpath('td[11]/text()').extract()
yield item
urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
urls = ["http://marketdata.set.or.th/mkt/"+ i for i in urll]
for url in urls:
request = scrapy.Request(url, callback=self.parse_following_urls, dont_filter=True)
yield request
request.meta['item'] = item
def parse_following_urls(self, response):
for sel in response.xpath('//table[3]/tbody'):
item = response.meta['item']
item['exp'] = sel.xpath('tr[1]/td[2]/text()').extract()
item['exrat'] = sel.xpath('tr[2]/td[2]/text()').extract()
item['exdat'] = sel.xpath('tr[3]/td[2]/text()').extract()
yield item
在尝试给出的建议并查看输出后,我重新编写了代码。下面是编辑后的代码。但是,我遇到另一个错误,该错误指出请求url必须是str或unicode,得到%s:“%type(url)。\uuu name\uuu)
。如何将URL从列表转换为字符串
我认为URL应该是字符串,因为它在For循环中。我在下面的代码中添加了这个注释。有什么办法解决这个问题吗
import scrapy
from scrapy.http import Request
class SET(scrapy.Item):
title = scrapy.Field()
open = scrapy.Field()
hi = scrapy.Field()
lo = scrapy.Field()
last = scrapy.Field()
bid = scrapy.Field()
ask = scrapy.Field()
vol = scrapy.Field()
exp = scrapy.Field()
exrat = scrapy.Field()
exdat = scrapy.Field()
class ThaiSpider(scrapy.Spider):
name = "warrant"
allowed_domains = ["marketdata.set.or.th"]
start_urls = ["http://marketdata.set.or.th/mkt/stocklistbytype.do?market=SET&language=en&country=US&type=W"]
def parse(self, response):
for sel in response.xpath('//table[@class]/tbody/tr'):
item = SET()
item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
item['open'] = sel.xpath('td[3]/text()').extract()
item['hi'] = sel.xpath('td[4]/text()').extract()
item['lo'] = sel.xpath('td[5]/text()').extract()
item['last'] = sel.xpath('td[6]/text()').extract()
item['bid'] = sel.xpath('td[9]/text()').extract()
item['ask'] = sel.xpath('td[10]/text()').extract()
item['vol'] = sel.xpath('td[11]/text()').extract()
url = ["http://marketdata.set.or.th/mkt/"]+ sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
request = scrapy.Request(url, callback=self.parse_following_urls, dont_filter=True) #Request url must be str or unicode, got list: How to solve this?
request.meta['item'] = item
yield item
yield request
def parse_following_urls(self, response):
for sel in response.xpath('//table[3]/tbody'):
item = response.meta['item']
item['exp'] = sel.xpath('tr[1]/td[2]/text()').extract()
item['exrat'] = sel.xpath('tr[2]/td[2]/text()').extract()
item['exdat'] = sel.xpath('tr[3]/td[2]/text()').extract()
yield item
我试着改变第五行的倒数
item = response.meta['item']
到
那就行了!
事实上,我不太了解你的“元”方式,因为我从来没有用它来描述这个项目 我知道您在这里试图做什么,这就是所谓的链接请求 这意味着您希望继续满足
请求
s,并在请求中继续携带您填写的项目
smeta
属性
对于您的情况,您所需要做的只是生成项目
生成一个请求
,其中包含一个项目。将解析更改为:
def parse(self, response):
for sel in response.xpath('//table[@class]/tbody/tr'):
item = SET()
item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
item['open'] = sel.xpath('td[3]/text()').extract()
item['hi'] = sel.xpath('td[4]/text()').extract()
item['lo'] = sel.xpath('td[5]/text()').extract()
item['last'] = sel.xpath('td[6]/text()').extract()
item['bid'] = sel.xpath('td[9]/text()').extract()
item['ask'] = sel.xpath('td[10]/text()').extract()
item['vol'] = sel.xpath('td[11]/text()').extract()
urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
urls = ["http://marketdata.set.or.th/mkt/" + i for i in urll]
for url in urls:
yield scrapy.Request(url,
callback=self.parse_following_urls,
meta={'item': item})
我看到的一个问题是,在parse
方法的末尾有request.meta['item']=item
行,它什么也不做。要将项添加到请求元,您需要在创建request
对象时执行此操作<代码>scrapy.Request(url,self.callback\u func,meta={'item':item})
。现在,它不再在item=response.meta['item']
行中断。它确实解决了问题,但输出仅包含从已删除URL列表的最后一个URL中删除的信息。是否有其他方法编辑代码,以便从“已删除URL”列表中删除所有URL中的所有信息?将最后第5行从item=response.meta['item']
更改为item=SET()
使代码半正确。它能够从被刮取的URL列表中刮取信息,但无法通过解析(self,response)输出信息:我现在遇到的问题是将项目从第一个解析函数parse(self,response)
传递到URL(self,response)后面的第二个解析函数parse\u
以便在项目中填充来自不同URL的不同字段。实际上,我已经阅读了scrapy教程和示例,并尝试了代码,但没有成功。有人知道如何解决这个问题吗?对于你的“输出”字,你是否正确地编写了管道代码?因为我使用了我自己的管道和你的spider代码,它更改了最后第5行,然后juse success(具体的“exp”内容就在我的item.json中),这种输出正确吗?我的最后一项是:[“],“exp”:[“3.50”],“exdat”:[“01/06/2018”]}您仍然可以获得已删除的信息,但它不在输出数据中的正确位置。最后一行应该包括所有11个字段,但您的代码没有给出前8个字段
def parse(self, response):
for sel in response.xpath('//table[@class]/tbody/tr'):
item = SET()
item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
item['open'] = sel.xpath('td[3]/text()').extract()
item['hi'] = sel.xpath('td[4]/text()').extract()
item['lo'] = sel.xpath('td[5]/text()').extract()
item['last'] = sel.xpath('td[6]/text()').extract()
item['bid'] = sel.xpath('td[9]/text()').extract()
item['ask'] = sel.xpath('td[10]/text()').extract()
item['vol'] = sel.xpath('td[11]/text()').extract()
urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
urls = ["http://marketdata.set.or.th/mkt/" + i for i in urll]
for url in urls:
yield scrapy.Request(url,
callback=self.parse_following_urls,
meta={'item': item})