【发布时间】:2017-09-07 14:00:39
【问题描述】:
我有一个链接列表,其中也有一些interesting urls:
start_urls = ['link1.com', 'link2.com', 'link3.com', ...,'linkN.com']
使用scrapy,如何获取?:
'link1.com' 'extracted1.link.com'
'link2.com' 'extracted2.link.com'
'link3.com' 'extracted3.link.com'
...
'linkN.com' 'extractedN.link.com'
由于我是scrapy的新手,我只为一个链接尝试了这个:
class ToySpider(scrapy.Spider):
name = "toy"
allowed_domains = ["https://www.example.com/"]
start_urls = ['link1.com']
def parse(self, response):
for link in response.xpath(".//*[@id='object']//tbody//tr//td//span//a[2]"):
item = ToyItem()
item['link'] = link.xpath('@href').extract_first()
item['interesting_link'] = link
yield item
但是,这让我回了:
{'link': 'extracted1.link.com',
'name': <Selector xpath=".//*[@id='object']//tbody//tr//td//span//a[2]" data='<a href="extracted1.link.com'>}
如何对start_urls 的所有元素执行上述操作并返回以下列表:
[
{'link': 'extracted1.link.com',
'name': 'link1.com'},
{'link': 'extracted2.link.com',
'name': 'link2.com'},
{'link': 'extracted3.link.com',
'name': 'link3.com'},
....
{'link': 'extractedN.link.com',
'name': 'linkN.com'}
]
更新
在尝试了@Granitosaurus 答案后,该答案是为没有的链接返回NaN:response.xpath(".//*[@id='object']//tbody//tr//td//span//a[2]") 我做到了:
def parse(self, response):
links = response.xpath(".//*[@id='object']//tbody//tr//td//span//a[2]")
if not links:
item = ToyItem()
item['link'] = 'NaN'
item['name'] = response.url
return item
for links in links:
item = ToyItem()
item['link'] = links.xpath('@href').extract_first()
item['name'] = response.url # <-- see here
yield item
list_of_dics = []
list_of_dics.append(item)
df = pd.DataFrame(list_of_dics)
print(df)
df.to_csv('/Users/user/Desktop/crawled_table.csv', index=False)
但是,不是返回(*):
'link1.com' 'NaN'
'link2.com' 'NAN'
'link3.com' 'extracted3.link.com'
我明白了:
'link3.com' 'extracted3.link.com'
如何返回(*)
【问题讨论】:
标签: python python-3.x beautifulsoup scrapy web-crawler