Python 使用Scrapy抓取网站,只抓取包含关键字的页面

Python 使用Scrapy抓取网站,只抓取包含关键字的页面,python,web-scraping,web-crawler,scrapy,Python,Web Scraping,Web Crawler,Scrapy,我正在尝试爬网各种网站,寻找感兴趣的特定关键词,只抓取那些页面。我已经编写了作为独立Python脚本运行的脚本,而不是传统的Scrapy项目结构(如下所示),并使用CrawlSpider类。其思想是,从给定的主页上,蜘蛛将抓取该域内的页面,并且只从包含关键字的页面上抓取链接。当我找到一个包含关键字的页面时,我还试图保存该页面的副本。这个问题的前一个版本与语法错误有关(请参阅下面的评论,感谢@tegancp帮助我澄清这一点),但现在虽然我的代码运行,但我仍然无法按照预期在感兴趣的页面上抓取链接 我

我正在尝试爬网各种网站,寻找感兴趣的特定关键词,只抓取那些页面。我已经编写了作为独立Python脚本运行的脚本,而不是传统的
Scrapy
项目结构(如下所示),并使用
CrawlSpider
类。其思想是,从给定的主页上,
蜘蛛将抓取该域内的页面,并且只从包含关键字的页面上抓取链接。当我找到一个包含关键字的页面时,我还试图保存该页面的副本。这个问题的前一个版本与语法错误有关(请参阅下面的评论,感谢@tegancp帮助我澄清这一点),但现在虽然我的代码运行,但我仍然无法按照预期在感兴趣的页面上抓取链接

我想要么我)在
\uuuu init\uuuu
函数中删除对
LinkExtractor
的调用,要么ii)只从
\uuuu init\uuu
中调用
LinkExtractor
,但使用基于我访问该页面时找到的内容而不是URL的某些属性的规则。我不能做I)因为
CrawlSpider
类需要一个规则,而我不能做ii)因为
LinkExtractor
没有一个
process\u links
选项,就像旧的
SgmlLinkExtractor
一样,它似乎已被弃用。我是Scrapy的新手,所以想知道我唯一的选择是否是编写自己的
LinkedExtractor

from scrapy.crawler import Crawler
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import Join, MapCompose, TakeFirst
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy import log, signals, Spider, Item, Field
from scrapy.settings import Settings
from twisted.internet import reactor


# define an item class
class GenItem(Item):
    url = Field()

# define a spider
class GenSpider(CrawlSpider):
    name = "genspider3"

    # requires 'start_url', 'allowed_domains' and 'folderpath' to be passed as string arguments IN THIS PARTICULAR ORDER!!!
    def __init__(self):

        self.start_urls = [sys.argv[1]]
        self.allowed_domains = [sys.argv[2]]
        self.folder = sys.argv[3]
        self.writefile1 = self.folder + 'hotlinks.txt'
        self.writefile2 = self.folder + 'pages.txt'

        self.rules = [Rule(LinkExtractor(allow_domains=(sys.argv[2],)), follow=True, callback='parse_links')]
        super(GenSpider, self).__init__()

    def parse_start_url(self, response):
        # get list of links on start_url page and process using parse_links
        list(self.parse_links(response))

    def parse_links(self, response):
       # if this page contains a word of interest save the HTML to file and crawl the links on this page

        theHTML = response.body
        if 'keyword' in theHTML:
            with open(self.writefile2, 'a+') as f2:
                f2.write(theHTML + '\n')
            with open(self.writefile1, 'a+') as f1:
                f1.write(response.url + '\n')


            for link in LinkExtractor(allow_domains=(sys.argv[2],)).extract_links(response):
                linkitem = GenItem()
                linkitem['url'] = link.url
                log.msg(link.url)
                with open(self.writefile1, 'a+') as f1:
                    f1.write(link.url + '\n')
                return linkitem



# callback fired when the spider is closed
def callback(spider, reason):
    stats = spider.crawler.stats.get_stats()  # collect/log stats?

    # stop the reactor
    reactor.stop()


# instantiate settings and provide a custom configuration
settings = Settings()
#settings.set('DEPTH_LIMIT', 2)
settings.set('DOWNLOAD_DELAY', 0.25)

# instantiate a crawler passing in settings
crawler = Crawler(settings)

# instantiate a spider
spider = GenSpider()

# configure signals
crawler.signals.connect(callback, signal=signals.spider_closed)

# configure and start the crawler
crawler.configure()
crawler.crawl(spider)
crawler.start()

# start logging
log.start(loglevel=log.DEBUG)

# start the reactor (blocks execution)
reactor.run()     

看起来语法错误实际上不在那一行,而是在前一行,缺少一个右括号。同时,你可能想考虑只使用一个链接提取程序。谢谢@ TeGANCCP,这是个问题,尽管还有很多,其中一个我可能需要提出另一个问题,但是至少在语法问题上我取得了一些进展。决定只编辑原始问题,因为标题仍然适用,我是StackOverflow新手,所以如果这不是通常的做法,请道歉。如果您使用
返回self.parse\u链接(响应)
而不是
parse\u start\u url()