我怀疑你会找到比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 时应该没关系。