【问题标题】:How to scrape from a list of links?如何从链接列表中抓取?
【发布时间】: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 答案后,该答案是为没有的链接返回NaNresponse.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


    【解决方案1】:

    您可以从response.url 属性中检索您的蜘蛛正在抓取的当前网址:

    start_urls = ['link1.com', 'link2.com', 'link3.com', ...,'linkN.com']
    
    def parse(self, response):
        links = response.xpath(".//*[@id='object']//tbody//tr//td//span//a[2]")
        if not links:
            item = ToyItem()
            item['link'] = None
            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
    

    【讨论】:

    • 感谢您的帮助。我还有另一个问题...我注意到一些linksN.com 没有:".//*[@id='object']//tbody//tr//td//span//a[2]"。此类情况如何返回:linkN, NaN
    • @tumbleweed 您可以检查是否找到任何链接,请参阅我的编辑:)
    • 非常感谢,你能检查我的更新吗?.. 我不明白如何为蜘蛛找不到 response 的网站的值返回 NaN
    • @tumbleweed 写入 csv 的部分存在问题。如果您需要 csv 输出,请查看 Feed Exports 或简单地使用 --output-o 标志运行,例如:scrapy crawl myspider -o output.csv
    • 再次感谢.. 问题是我只是为了查看输出:to_csv()。我将更多地操作数据框,这就是我不能使用-o 标志的原因......可能我会在另一个问题中打开这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多