使用scrapy时如何解决订单问题?

时间:2019-04-01 04:34:24

标签: python python-3.x scrapy

我相信这是一个简单的方法,我愿意学习更多。问题是我想通过URL来抓取网站标题。这样做的目的是预测在线新闻的受欢迎程度,而数据来自UCI机器学习存储库。这是the link

我遵循Scrapy的教程,并按如下所示更改“ quotes spider”中的代码。在终端中运行“ scrapy爬引号”后,我使用“ scrapy爬引号-o quotes.json”将所有标题保存为JSON。

有158人失踪。我有39486个URL,但有39644个网站标题。此外,每个网站的顺序都不适合每个URL。例如,最终标题对应于倒数第三个URL。您能帮我找出问题吗?

这是结果

我尝试在Jupyter Notebook中使用“ Beautiful汤”,但速度很慢,无法确定代码是否仍在运行。

import scrapy
import pandas as pd


df = pd.read_csv("/Users/.../OnlineNewsPopularity.csv",delim_whitespace=False)
url = df['url']

class QuotesSpider(scrapy.Spider):
    name = "quotes"    
    start_urls = url.values.tolist()

    def parse(self, response):
        for quote in response.css('h1.title'):
            yield {
                'Title': quote.css('h1.title::text').extract_first(),
            }

1 个答案:

答案 0 :(得分:0)

如果您的目的只是保持URL和标题之间的对应关系,则可以将URL添加到抓取的项目中:

def parse(self, response):
    for quote in response.css('h1.title'):
        yield {
            'Title': quote.css('h1.title::text').extract_first(),              
            'url': response.url
        }

相反,如果要按顺序处理URL,则有多种方法,有点复杂。 最常见的想法是编写一个方法start_request,在此方法中您仅请求第一个URL。然后,在方法解析中,您请求第二个URL,并将相同的方法(解析)设置为回调;等等...

请参见Sequential scraping from multiple start_urls leading to error in parsingScrapy Crawl URLs in Order