【问题标题】:Scrapy multiple domains and start urls抓取多个域并启动 url
【发布时间】:2018-08-31 18:29:50
【问题描述】:

我有一个简单的Sracpy 蜘蛛,它将域中的所有页面导出到单个 csv 文件。大多数人建议为每个站点编写不同的爬虫,但考虑到我要求的信息非常简单,我认为弄清楚如何遍历域列表是有意义的。最终会有数千个我想从中获取链接的域,所有域都有非常不同的结构,所以我希望蜘蛛能够扩展。

以下是蜘蛛从中提取域的 csv 中的几行:

这是我最近的尝试:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from NONPROF.items import NonprofItem
from scrapy.http import Request
import pandas as pd

file_path = 'C:/listofdomains.csv'
open_list = pd.read_csv(file_path)
urlorgs = open_list.urls.tolist()

open_list2 = pd.read_csv(file_path)
domainorgs = open_list2.domain.tolist()

class Nonprof(CrawlSpider):
    name = "responselist"
    allowed_domains = domainorgs
    start_urls = urlorgs

    rules = [
        Rule(LinkExtractor(
            allow=['.*']),
             callback='parse_item',
             follow=True)
        ]

    def parse_item (self, response):
        item = NonprofItem()
        item['responseurl'] = response.url
        yield item

运行蜘蛛时我没有收到明显的错误,但它似乎没有产生任何结果:[scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

所以我有几个问题: 1.scrapy能处理这样的请求吗? 2. 有没有更好的方法让蜘蛛遍历域列表并匹配 start_url?

【问题讨论】:

  • 请从您的 CSV 文件中显示几行
  • @gangabass 进行了建议的修改

标签: python python-3.x web-scraping scrapy


【解决方案1】:

我认为主要问题是您没有使用 start_request 方法!

然后你可以优先考虑每个 url

这是一个有效的示例代码:

"""
For allowed_domains:
Let’s say your target url is https://www.example.com/1.html, 
then add 'example.com' to the list.
"""
class crawler(CrawlSpider):
    name = "crawler_name"

    allowed_domains, urls_to_scrape = parse_urls()
    rules = [
        Rule(LinkExtractor(
            allow=['.*']),
             callback='parse_item',
             follow=True)
        ]
    def start_requests(self):
        for i,url in enumerate(self.urls_to_scrape):
            yield scrapy.Request(url=url.strip(),callback=self.parse_item, priority=i+1, meta={"pass_anydata_hare":1})

    def parse_item(self, response):
        response = response.css('logic')

        yield {'link':str(response.url),'extracted data':[],"meta_data":'data you passed' }

我建议您在 scrapy 上阅读此页面以获取更多信息

https://docs.scrapy.org/en/latest/topics/spiders.html#scrapy.spider.Spider.start_requests

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2014-02-12
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多