Конвейер Python Scrapy вдруг не работает
Это очень странно, я написал код scrapy с его конвейером и сканировал огромное количество данных, он всегда работал хорошо. Сегодня, когда я перезапускаю тот же код, он вдруг вообще не работает. Вот подробности:
Мой паук - base_url_spider.py
import re
from bs4 import BeautifulSoup
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class BaseURLSpider(CrawlSpider):
'''
This class is responsible for crawling globe and mail articles and their comments
'''
name = 'BaseURL'
allowed_domains = ["www.theglobeandmail.com"]
# seed urls
url_path = r'../Sample_Resources/Online_Resources/sample_seed_urls.txt'
start_urls = [line.strip() for line in open(url_path).readlines()]
# Rules for including and excluding urls
rules = (
Rule(LinkExtractor(allow=r'\/opinion\/.*\/article\d+\/$'), callback="parse_articles"),
)
def __init__(self, **kwargs):
'''
:param kwargs:
Read user arguments and initialize variables
'''
CrawlSpider.__init__(self)
self.headers = ({'User-Agent': 'Mozilla/5.0',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'})
self.ids_seen = set()
def parse_articles(self, response):
article_ptn = "http://www.theglobeandmail.com/opinion/(.*?)/article(\d+)/"
resp_url = response.url
article_m = re.match(article_ptn, resp_url)
article_id = ''
if article_m != None:
article_id = article_m.group(2)
if article_id not in self.ids_seen:
self.ids_seen.add(article_id)
soup = BeautifulSoup(response.text, 'html.parser')
content = soup.find('div', {"class":"column-2 gridcol"})
if content != None:
text = content.findAll('p', {"class":''})
if len(text) > 0:
print('*****In Spider, Article ID*****', article_id)
print('***In Spider, Article URL***', resp_url)
yield {article_id: {"article_url": resp_url}}
Если я только запускаю свой код паука через командную строку scrapy runspider --logfile ../logs/log.txt ScrapeNews/spiders/article_base_url_spider.py
, Он может сканировать все URL в start_urls
,
Мой конвейер - base_url_pipelines.py
import json
class BaseURLPipelines(object):
def process_item(self, item, spider):
article_id = list(item.keys())[0]
print("****Pipeline***", article_id)
f_name = r'../Sample_Resources/Online_Resources/sample_base_urls.txt'
with open(f_name, 'a') as out:
json.dump(item, out)
out.write("\n")
return(item)
Мои настройки - settings.py У меня есть эти строки без комментариев:
BOT_NAME = 'ScrapeNews'
SPIDER_MODULES = ['ScrapeNews.spiders']
NEWSPIDER_MODULE = 'ScrapeNews.spiders'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 3
ITEM_PIPELINES = {
'ScrapeNews.article_comment_pipelines.ArticleCommentPipeline': 400,
}
Мой scrapy.cfg Этот файл должен использоваться, чтобы указать, где находится файл настроек
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.org/en/latest/deploy.html
[settings]
default = ScrapeNews.settings
[deploy]
#url = http://localhost:6800/
project = ScrapeNews
Все эти вещи хорошо работали вместе.
Однако сегодня, когда я повторно запускаю код, я получил такой тип вывода журнала:
2017-04-24 14:14:15 [scrapy] INFO: Enabled item pipelines:
['ScrapeNews.article_comment_pipelines.ArticleCommentPipeline']
2017-04-24 14:14:15 [scrapy] INFO: Spider opened
2017-04-24 14:14:15 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-04-24 14:14:15 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-04-24 14:14:15 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/robots.txt> (referer: None)
2017-04-24 14:14:20 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/opinion/austerity-is-here-all-that-matters-is-the-math/article627532/> (referer: None)
2017-04-24 14:14:24 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/opinion/ontario-can-no-longer-hide-from-taxes-restraint/article546776/> (referer: None)
2017-04-24 14:14:24 [scrapy] DEBUG: Filtered duplicate request: <GET http://www.theglobeandmail.com/life/life-video/video-what-was-starbucks-thinking-with-their-new-unicorn-frappuccino/article34787773/> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
2017-04-24 14:14:31 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/opinion/for-palestinians-the-other-enemy-is-their-own-leadership/article15019936/> (referer: None)
2017-04-24 14:14:32 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/opinion/would-quebecs-partitiongo-back-on-the-table/article17528694/> (referer: None)
2017-04-24 14:14:36 [scrapy] INFO: Received SIG_UNBLOCK, shutting down gracefully. Send again to force
2017-04-24 14:14:36 [scrapy] INFO: Closing spider (shutdown)
2017-04-24 14:14:36 [scrapy] INFO: Received SIG_UNBLOCK twice, forcing unclean shutdown
По сравнению с вышеприведенным ненормальным выводом журнала, если я только запускаю своего паука здесь, журнал был в порядке, показывая такие вещи:
2017-04-24 14:21:20 [scrapy] DEBUG: Scraped from <200 http://www.theglobeandmail.com/opinion/were-ripe-for-a-great-disruption-in-higher-education/article543479/>
{'543479': {'article_url': 'http://www.theglobeandmail.com/opinion/were-ripe-for-a-great-disruption-in-higher-education/article543479/'}}
2017-04-24 14:21:20 [scrapy] DEBUG: Scraped from <200 http://www.theglobeandmail.com/opinion/saint-making-the-blessed-politics-of-canonization/article624413/>
{'624413': {'article_url': 'http://www.theglobeandmail.com/opinion/saint-making-the-blessed-politics-of-canonization/article624413/'}}
2017-04-24 14:21:20 [scrapy] INFO: Closing spider (finished)
2017-04-24 14:21:20 [scrapy] INFO: Dumping Scrapy stats:
В приведенном выше неправильном выводе журнала я заметил что-то вроде роботов:
2017-04-24 14:14:15 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-04-24 14:14:15 [scrapy] DEBUG: Crawled (200) <GET http://www.theglobeandmail.com/robots.txt> (referer: None)
ПОЛУЧИТЕ http://www.theglobeandmail.com/robots.txt никогда не появлялся во всем нормальном выводе журнала. Но когда я набрал это в браузере, я не совсем понял, что это такое. Так что я не уверен, что это потому, что на сайте, который я сканирую, добавлено несколько ботов?
Или проблема возникла из Received SIG_UNBLOCK, корректно завершающего работу? Но я не нашел никакого решения для этого.
Командная строка, которую я использовал для запуска кода scrapy runspider --logfile ../../Logs/log.txt base_url_spider.py
Вы знаете, как бороться с этой проблемой?
1 ответ
Файл robots.txt - это файл, который используется веб-сайтом для уведомления сканера веб-сайтов о том, разрешено ли его удаление. Вы устанавливаете ROBOTSTXT_OBEY = True, что означает, что scrapy будет подчиняться настройке robots.txt.
Измените ROBOTSTXT_OBEY = False, и оно должно работать.