Python 使用scrapy刮取多个域的最佳方法是什么?
我有大约10多个网站,我希望刮。其中有两个是wordpress博客,它们遵循相同的html结构,尽管有不同的类。其他的则是其他形式的论坛或博客 我喜欢搜集的信息很常见——帖子内容、时间戳、作者、标题和评论 我的问题是,我是否必须为每个域创建一个单独的spider?如果没有,我如何创建一个通用的爬行器,通过从配置文件或类似文件加载选项来进行抓取Python 使用scrapy刮取多个域的最佳方法是什么?,python,screen-scraping,scrapy,Python,Screen Scraping,Scrapy,我有大约10多个网站,我希望刮。其中有两个是wordpress博客,它们遵循相同的html结构,尽管有不同的类。其他的则是其他形式的论坛或博客 我喜欢搜集的信息很常见——帖子内容、时间戳、作者、标题和评论 我的问题是,我是否必须为每个域创建一个单独的spider?如果没有,我如何创建一个通用的爬行器,通过从配置文件或类似文件加载选项来进行抓取 我想我可以从一个文件中加载xpath表达式,该文件的位置可以通过命令行加载,但在某些域的抓取要求我使用regexselect(expression\u h
我想我可以从一个文件中加载xpath表达式,该文件的位置可以通过命令行加载,但在某些域的抓取要求我使用regex
select(expression\u here).re(regex)
,而有些域则不需要 您应该使用BeautifulSoup,尤其是在使用Python时。它使您能够在页面中查找元素,并使用正则表达式提取文本。我使用以下XPath表达式执行类似操作:
的标题”/html/head/title/text()”
用于帖子内容//p[string length(text())>150]/text()
class YourSpider(CrawlSpider):
allowed_domains = [ 'domain1.com','domain2.com' ]
希望有帮助您可以使用空的
allowed_domains
属性来指示scrapy不要过滤任何异地请求。但是在这种情况下,您必须小心,只返回来自spider的相关请求。我也遇到了同样的问题,所以我使用type()
动态创建了spider类
比如说,要为“”创建一个spider,我只需要-
In [3]: google_spider = GenericSpider.create('http://www.google.com')
In [4]: google_spider
Out[4]: __main__.GoogleComGenericSpider
In [5]: google_spider.name
Out[5]: 'www.google.com'
希望这对您有所帮助您可以使用启动请求方法 然后,您还可以对每个url进行优先级排序! 然后你可以传递一些元数据 下面是一个有效的示例代码:
"""
For allowed_domains:
Let’s say your target url is https://www.example.com/1.html,
then add 'example.com' to the list.
"""
class crawler(CrawlSpider):
name = "crawler_name"
allowed_domains, urls_to_scrape = parse_urls()
rules = [
Rule(LinkExtractor(
allow=['.*']),
callback='parse_item',
follow=True)
]
def start_requests(self):
for i,url in enumerate(self.urls_to_scrape):
yield scrapy.Request(url=url.strip(),callback=self.parse_item, priority=i+1, meta={"pass_anydata_hare":1})
def parse_item(self, response):
response = response.css('logic')
yield {'link':str(response.url),'extracted data':[],"meta_data":'data you passed' }
我建议您在scrapy上阅读此页以了解更多信息
希望这有帮助:)
"""
For allowed_domains:
Let’s say your target url is https://www.example.com/1.html,
then add 'example.com' to the list.
"""
class crawler(CrawlSpider):
name = "crawler_name"
allowed_domains, urls_to_scrape = parse_urls()
rules = [
Rule(LinkExtractor(
allow=['.*']),
callback='parse_item',
follow=True)
]
def start_requests(self):
for i,url in enumerate(self.urls_to_scrape):
yield scrapy.Request(url=url.strip(),callback=self.parse_item, priority=i+1, meta={"pass_anydata_hare":1})
def parse_item(self, response):
response = response.css('logic')
yield {'link':str(response.url),'extracted data':[],"meta_data":'data you passed' }