首页 > 解决方案 > 使用scrapy时如何解决订单问题?

问题描述

我相信这是一个简单的,我愿意学习更多。问题是我想通过 URL 抓取网站标题。这样做的目的是预测在线新闻的流行度,数据来自 UCI 机器学习存储库。这是链接

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

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

这是结果

我尝试在 Jupyter Notebook 中使用“美丽的汤”,但速度很慢,无法判断代码是否仍在运行。

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(),
            }

标签: pythonpython-3.xscrapy

解决方案


如果您的目标只是保持 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,将相同的方法(解析)设置为回调;等等...

请参阅从多个 start_urls 顺序抓取导致解析错误按顺序抓取 URL


推荐阅读