Python 使用scrapy刮取多个域的最佳方法是什么?

Python 使用scrapy刮取多个域的最佳方法是什么?,python,screen-scraping,scrapy,Python,Screen Scraping,Scrapy,我有大约10多个网站,我希望刮。其中有两个是wordpress博客,它们遵循相同的html结构,尽管有不同的类。其他的则是其他形式的论坛或博客 我喜欢搜集的信息很常见——帖子内容、时间戳、作者、标题和评论 我的问题是,我是否必须为每个域创建一个单独的spider?如果没有,我如何创建一个通用的爬行器,通过从配置文件或类似文件加载选项来进行抓取 我想我可以从一个文件中加载xpath表达式,该文件的位置可以通过命令行加载,但在某些域的抓取要求我使用regexselect(expression\u h

我有大约10多个网站,我希望刮。其中有两个是wordpress博客,它们遵循相同的html结构,尽管有不同的类。其他的则是其他形式的论坛或博客

我喜欢搜集的信息很常见——帖子内容、时间戳、作者、标题和评论

我的问题是,我是否必须为每个域创建一个单独的spider?如果没有,我如何创建一个通用的爬行器,通过从配置文件或类似文件加载选项来进行抓取


我想我可以从一个文件中加载xpath表达式,该文件的位置可以通过命令行加载,但在某些域的抓取要求我使用regex
select(expression\u here).re(regex)
,而有些域则不需要

您应该使用BeautifulSoup,尤其是在使用Python时。它使您能够在页面中查找元素,并使用正则表达式提取文本。

我使用以下XPath表达式执行类似操作:

  • ”/html/head/title/text()”
    的标题
  • //p[string length(text())>150]/text()
    用于帖子内容

在scrapy spider上,将允许的\u域设置为域列表,例如:

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' }