0

所以我有一个从数据库中提取的 URL 列表,我需要爬取和解析每个 URL 的 JSON 响应。一些 URL 返回 null,而另一些则返回发送到 csv 文件的信息。我目前正在使用 Scrapy,但是抓取这 12000 个 URL 大约需要 4 个小时。我研究了诸如scrapy-redisscrapy clusterfrontera之类的东西,但我不确定它们是否适合我的用例,因为它们似乎是围绕在网站上抓取找到的 URL 展开的。

在单台机器上抓取这么多网址,4 小时是“正常”时间吗?或者是否有任何可能更适合我的软件包,当页面被抓取时没有“跟随”链接?

4

3 回答 3

1

URL 和输出是否相互独立?您可以设置 Python 多处理,并并行执行此操作,然后在最后组合输出。进程数由您决定,但允许您使用机器的 1 个以上核心。

https://docs.python.org/2/library/multiprocessing.html

此外,您是否需要加载内容,或者您​​可以使用响应代码告诉您服务器是否在该 URL 上响应等。

如果您要做大量此类工作,并且想要快速处理,那么 Golang 对 Web 服务和并行化具有出色的支持。

于 2020-08-25T14:07:47.070 回答
1

我怀疑你会找到比scrapy更快的方法。它有很好的抓取网站的工具,但它也可以只用于抓取已知 url:s 的列表。它对于抓取 json 也很有用。只需确保您同时对多个页面使用并发请求即可。如果您有在短时间内因为多个请求而被阻止的风险,您可以使用旋转代理 kike https://github.com/TeamHG-Memex/scrapy-rotating-proxies或使用像 crawlera 这样的抓取 VPN。4 小时仅 12k 的 url:s 听起来很多。

您如何使用 Scrapy 抓取 json 文件?

这段代码将从瑞典创新机构 Vinnova 抓取一个 json 文件,其中包含所有从该机构获得融资的项目,并输出所有项目的标题:

import scrapy
import json


class TestscraperSpider(scrapy.Spider):
    name = 'testScraper'
    allowed_domains = ['vinnova.se']
    start_urls = [
        'https://www.vinnova.se/sok-finansiering/hitta-finansiering/search/']

    def parse(self, response):

        jsonresponse = json.loads(response.body_as_unicode())
        titles = [project['Heading']
                  for project in jsonresponse['FindHitList']]
        yield {"titles": titles}

如果你有多个 json 文件要抓取,你可以在列表中添加更多 url:s。您可以通过三种不同的方式执行此操作。

1.手动添加

您可以将更多 url:s 复制并粘贴到列表中。如果你有 12k 的 url:s,可能不是最好的方法。

start_urls = [
        'domain.com/link1', 'domain.com/link2', 'domain.com/link3', 'domain.com/link4',]

2. 从外部来源获取 start url:s

您可以通过编写自定义初始化来覆盖 start_urls,如下所示:

def __init__(self):
    # Get list of urls from external source 
    self.start_urls = data_external

3.使用自定义方法请求url:s

在这里,您只需绕过 start_url:s 并为每个链接手动调用 scrapy:s 请求方法。

from scrapy.http import Request

def start_requests(self):
    # Get url:s from external source. 
    for url in urls:
        yield Request(url)

在您的情况下,您可能可以使用 2 或 3。当它是少数 url:s 时应该没关系。

于 2020-08-26T08:03:39.283 回答
0

您可以使用 FireScraper,https: //firescraper.com/ 。它是从多个 URL 中抓取文本的好工具。因为部分原因是它没有在您的机器上运行,而且它比我尝试过的其他工具快一点。

于 2022-01-10T03:04:55.273 回答