从外部域停止 Scrapy 爬虫

时间:2020-12-30 11:57:05

标签: python scrapy

我是scrapy的新手,并尝试在我允许的域和起始网址如下所示的几个网站上运行爬虫

 allowed_domains = ['www.siemens.com']

start_urls= ['https://www.siemens.com/']

问题是该网站还包含指向不同域的链接,例如

<块引用>

“siemens.fr”和“seimens.de”

而且我不希望scrapy 也抓取这些网站。关于如何告诉蜘蛛不要抓取这些网站的任何建议。 我正在尝试构建一个更通用的蜘蛛,以便它也适用于其他网站

更新#2

按照 Felix Eklöf 的建议,我尝试调整我的代码并更改一些设置。这是现在代码的样子

蜘蛛

class webSpider(scrapy.Spider):
    name = 'web'
    allowed_domains = ['eaton.com']

    start_urls= ['https://www.eaton.com/us/']


    # include_patterns = ['']
    exclude_patterns = ['.*\.(css|js|gif|jpg|jpeg|png)']
    #proxies = 'proxies.txt'
    response_type_whitelist = ['text/html']
    # response_type_blacklist = []
    rules = [Rule(LinkExtractor(allow = (allowed_domains)), callback='parse_item', follow=True)]
   

设置如下:

SPIDER_MIDDLEWARES = {
   'smartspider.middlewares.SmartspiderSpiderMiddleware': 543,
    #'scrapy_testmaster.TestMasterMiddleware': 950
}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    'smartspider.middlewares.SmartspiderDownloaderMiddleware': 543,
    'smartspider.middlewares.FilterResponses': 543,
    'smartspider.middlewares.RandomProxyForReDirectedUrls': 650,
     "scrapy.spidermiddlewares.offsite.OffsiteMiddleware": 543
}
ITEM_PIPELINES = {
    'smartspider.pipelines.SmartspiderPipeline': 300,
}

请让我知道这些设置中是否有任何干扰蜘蛛只访问内部链接和维护给定域

更新 3# 正如@Felix 所建议的,我更新了现在看起来像这样的 Spider

class WebSpider(CrawlSpider):
    name = 'web'
    allowed_domains = ['eaton.com']
    start_urls= ['https://www.eaton.com/us/']
    # include_patterns = ['']
    exclude_patterns = ['.*\.(css|js|gif|jpg|jpeg|png)']
    
    response_type_whitelist = ['text/html']
    rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)]

设置外观

#SPIDER_MIDDLEWARES = {
#    'smartspider.middlewares.SmartspiderSpiderMiddleware': 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    # 'smartspider.middlewares.SmartspiderDownloaderMiddleware': 543,
    'smartspider.middlewares.FilterResponses': 543,
    'smartspider.middlewares.RandomProxyForReDirectedUrls': 650,
}

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
#    'smartspider.pipelines.SmartspiderPipeline': 300,
#}

但蜘蛛仍在抓取不同的域。

但是日志显示它拒绝了另一个网站 (thalia.de) 的异地网站

2021-01-04 19:46:42 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'www.rtbhouse.com': <GET https://www.rtbhouse.com/privacy-center/>
2021-01-04 19:46:42 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'www.quicklizard.com': <GET https://www.quicklizard.com/terms-of-service/>
2021-01-04 19:46:42 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.thalia.de/shop/hilfe-gutschein/show/> (referer: https://www.thalia.de/)
2021-01-04 19:46:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.thalia.de/shop/hilfe-kaufen/show/> (referer: https://www.thalia.de/)
2021-01-04 19:46:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.thalia.de/shop/home/login/login/?source=%2Fde.buch.shop%2Fshop%2F2%2Fhome%2Fkundenbewertung%2Fschreiben%3Fartikel%3D149426569&jumpId=2610518> (referer: https://www.thalia.de/shop/home/artikeldetails/ID149426569.html)
2021-01-04 19:46:43 [scrapy.extensions.logstats] INFO: Crawled 453 pages (at 223 pages/min), scraped 0 items (at 0 items/min)
2021-01-04 19:46:43 [scrapy.spidermiddlewares.depth] DEBUG: Ignoring link (depth > 2): https://www.thalia.de/shop/home/show/ 

蜘蛛是否按预期工作或问题出在特定网站上?

4 个答案:

答案 0 :(得分:1)

尝试删除“www”。来自allowed_domains

根据 Scrapy 文档,您应该这样做:

<块引用>

假设您的目标网址是 https://www.example.com/1.html,那么 将 'example.com' 添加到列表中。

所以,就你而言:

allowed_domains = ['siemens.com']

start_urls= ['https://www.siemens.com/']

答案 1 :(得分:0)

请仔细查看其他特定于国家/地区的域,例如 siemens.de、siemens.dk、siemens.fr 等。

如果您对德国网站 curl --head https://www.siemens.de 运行 curl 调用,您将看到 301 状态代码。

网址被重定向到 https://new.siemens.com/**de**/de.html

在其他国家/地区观察到相同的模式。 ISO 3166-1 alpha-2 代码嵌入在 URL 中。如果您需要过滤,这里是解决问题的位置。

答案 2 :(得分:0)

我仔细查看了您的代码,可能已经发现了问题。

我相信问题出在这条线上:

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

LinkExtractor 类期望参数 allowstrliststr's,但是 str 也应该是正则表达式。由于您在 url 中有一个 .(点),正则表达式会将其解释为任何字符。

相反,您可以使用论证 allow_domains。像这样。

rules = [Rule(LinkExtractor(allow_domains = allowed_domains), callback='parse_item', follow=True)]

但是,这些请求仍然应该被 allowed_domains 过滤掉。所以我不确定为什么这不起作用,但试试这个。

答案 3 :(得分:0)

我真的不知道出了什么问题,但我自己做了一个测试项目。这是一个完全干净的项目,仅在 settings.py 中更改了 ROBOTSTXT_OBEY = False

我注意到您的蜘蛛类正在扩展 scrapy.Spider 但使用 rules,我相信该类变量仅由通用蜘蛛 CrawlSpider 使用。

这是我的 testSpider。

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider

class TestSpider(CrawlSpider):
    name = 'web'
    allowed_domains = ['stackoverflow.com']
    start_urls = ['https://www.stackoverflow.com/']
    rules = [Rule(link_extractor=LinkExtractor(), follow=True)]

它似乎工作正常

2021-01-04 12:50:13 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2021-01-04 12:50:13 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://stackoverflow.com/> from <GET https://www.stackoverflow.com/>
2021-01-04 12:50:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://stackoverflow.com/> (referer: None)
2021-01-04 12:50:13 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'stackexchange.com': <GET https://stackexchange.com/sites>
2021-01-04 12:50:13 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'stackoverflow.blog': <GET https://stackoverflow.blog>
2021-01-04 12:50:13 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET https://stackoverflow.com/#for-developers> - no more 
duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
2021-01-04 12:50:14 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'www.g2.com': <GET https://www.g2.com/products/stack-overflow-for-teams/>
2021-01-04 12:50:14 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'stackoverflowbusiness.com': <GET https://stackoverflowbusiness.com>
2021-01-04 12:50:14 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'serverfault.com': <GET https://serverfault.com>

所以我会尝试使用 CrawlSpider。另外,如果它不起作用,您可以发布蜘蛛的整个代码,然后我可以对其进行调试。