繁体   English   中英

Python scrapy spider 抓取不同url的所有子站点

[英]Python scrapy spider crawl all sub-sites of different urls

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

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

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

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

最后,一旦完成一个链接,我如何重新启动该过程? 我的想法是对 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()
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您的LOG_LEVEL设置为'INFO' (或您想要的任何其他级别)。 阅读更多。


我不明白这部分代码的重点是什么:

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 反应器,默认情况下该反应器会在爬虫完成后停止,并且不会重新启动。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM