【问题标题】:Python scrapy spider crawl all sub-sites of different urlspython scrapy蜘蛛爬取不同url的所有子站点
【发布时间】:2020-09-29 15:45:20
【问题描述】:

如果我只是愚蠢,请原谅我对 Python 和 Webscraping 还很陌生

我想抓取具有不同结构的多个站点的所有文本元素,因此第一步想要爬取每个站点并检索每个域的不同子站点的所有 url

但首先我的代码不适用于我通过的每个链接,我收到此通知

2020-09-29 17:24:04 [scrapy.core.engine] 调试:已爬网 (200) https://markus-pieper.eu/>(引用者:无)

最后,如何在一个链接完成后重新启动该过程?我的想法是为 for 循环中的每个链接执行此操作,因此我得到每个链接的子站点 url 列表,但我无法使用新 url 重新启动爬虫

有人可以帮忙吗?提前非常感谢

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import scrapy
from scrapy.crawler import CrawlerProcess
import re

global base_links, link_list, links
link_list = []
base_links = []

# assign list of urls to crawl
links = ['https://bernd-lange.de/',
         'https://markus-pieper.eu/']

# strips urls in order to get base-urls
for link in links:
    base = re.sub('/$', '', link)
    base = re.sub('^https:\/\/', '', base)
    base = re.sub('^www.', '', base)
    base_links.append(base)


class SpiderSpider(CrawlSpider):
    name= "sites"
    #allowed_domains = base_links

    le = LinkExtractor(allow_domains = base_links, unique=True)

    #rules = [Rule(le, callback='parse_all_subsites', follow=True)]
    rules = [Rule(le, callback='parse_all_subsites', follow=False)]

    def parse_all_subsites(self, response):
        #for link in response.css('a::attr(href)'):
        extracted_links = self.le.extract_links(response)
        pages = set()

        for link in extracted_links:
            pages.add(link.url)

        link_list.append(pages)


process = CrawlerProcess()

#iterates over every link and adds list of links of every sub-site to link_list
for link in links:

    process.crawl(SpiderSpider, start_urls=link)
    process.start()

【问题讨论】:

    标签: python scrapy web-crawler screen-scraping


    【解决方案1】:
    2020-09-29 17:24:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://markus-pieper.eu/> (referer: None)
    

    这是一条 DEBUG 消息,它告诉您引擎抓取了该 url,仅此而已。这不是错误。如果您不想看到 DEBUG 消息,您可以在 settings.py 中将您的 LOG_LEVEL 设置为 'INFO'(或您想要的任何其他级别)。 Read more.


    我不明白这部分代码的意义何在:

    global base_links, link_list, links
    link_list = []
    base_links = []
    
    # assign list of urls to crawl
    links = ['https://bernd-lange.de/',
             'https://markus-pieper.eu/']
    
    # strips urls in order to get base-urls
    for link in links:
        base = re.sub('/$', '', link)
        base = re.sub('^https:\/\/', '', base)
        base = re.sub('^www.', '', base)
        base_links.append(base)
    

    看来您可以将所有这些替换为:

     class SpiderSpider(CrawlSpider):
         start_urls = ['https://bernd-lange.de/',
                       'https://markus-pieper.eu/']
    

    如果我弄错了,请在此处解释您要执行的操作。


    最后,我认为CrawlerProcess 并不是真的要在循环中使用[像那样]。当你调用process.start()时,Scrapy 的 CrawlerProcess 会启动一个 Twisted reactor,默认情况下会在爬虫完成后停止,并且不会重新启动。

    特别是,我认为你可以在同一个蜘蛛中使用相同的进程做你想做的所有事情,只需使用 start_urls 属性中的所有链接。无论如何,如果您想要/需要保留此设计,您可以查看documentation 有一个在同一进程中运行多个蜘蛛的示例。您可以尝试的另一种可能的解决方案是使用stop_after_crawl=False 调用process.start(),阅读更多here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多