我的问题是如何做和前面的问题一样的事情,但是在0.14。
Using one Scrapy spider for several websites
基本上,我有一个GUI,它接受域、关键字、标记名等参数,我想创建一个通用的蜘蛛来抓取这些标记中关键字的域。我读过一些冲突的东西,使用旧版本的scrapy,或者重写spider管理器类,或者动态创建一个spider。首选哪种方法,如何实现和调用正确的解决方案?提前谢谢。
这是我想通用的代码。它还使用美容品组。我把它配对了,所以希望没有删除任何重要的理解它。
class MySpider(CrawlSpider):
name = 'MySpider'
allowed_domains = ['somedomain.com', 'sub.somedomain.com']
start_urls = ['http://www.somedomain.com']
rules = (
Rule(SgmlLinkExtractor(allow=('/pages/', ), deny=('', ))),
Rule(SgmlLinkExtractor(allow=('/2012/03/')), callback='parse_item'),
)
def parse_item(self, response):
contentTags = []
soup = BeautifulSoup(response.body)
contentTags = soup.findAll('p', itemprop="myProp")
for contentTag in contentTags:
matchedResult = re.search('Keyword1|Keyword2', contentTag.text)
if matchedResult:
print('URL Found: ' + response.url)
pass
我使用Scrapy Extensions方法将Spider类扩展到一个名为Masterspider的类,该类包含一个通用解析器。
下面是我的通用扩展解析器的“short”版本。注意,一旦开始使用AJAX处理页面,就需要使用Javascript引擎(例如Selenium或BeautifulSoup)a实现呈现程序。还有很多额外的代码来管理站点之间的差异(基于列标题的废弃、处理相对URL与长URL、管理不同类型的数据容器等)。
与Scrapy扩展方法相关的是,如果有不合适的地方,您仍然可以重写泛型解析器方法,但我从来没有这样做过。Masterspider类检查是否在特定于站点的spider类下创建了某些方法(例如parser_start、next_url_parser…),以允许管理特定内容:发送表单、从页面中的元素构造下一个_url请求等
由于我正在抓取非常不同的网站,总是有具体的管理。这就是为什么我更喜欢为每个被刮掉的站点保留一个类,这样我就可以编写一些特定的方法来处理它(除了管道、请求生成器等之外的前/后处理)。
masterspider/sitespider/settings.py
masterspider/masterspdier/masterspider.py
masterspider/sitespider/spiders/somesite_spider.py
您可以创建一个由解释器计算的运行时蜘蛛。此代码段可以在运行时进行计算,如下所示:
不要将变量
name
、allowed_domains
、start_urls
和rules
附加到类中,您应该编写一个MySpider.__init__
,调用通过必要参数的CrawlSpider.__init__
,并为每个对象设置name
、allowed_domains
等。MyProp
和关键字也应该在__init__
中设置。所以最后你应该有下面这样的东西。您不必向参数添加name
,因为name
是由BaseSpider
本身从kwargs
设置的:相关问题 更多 >
编程相关推荐