用scrapy刮取多个域名的最好方法是什么?

问题描述 投票:6回答:6

我有大约10个奇怪的网站,我希望从这些网站中刮取。其中有几个是wordpress博客,他们遵循相同的html结构,尽管有不同的类。其他的则是论坛或其他格式的博客。

我喜欢的信息是常见的--帖子内容、时间戳、作者、标题和评论。

我的问题是,我必须为每个域创建一个单独的蜘蛛吗?如果不需要,我怎样才能创建一个通用的蜘蛛,让我通过从配置文件或类似的东西加载选项来进行搜刮?

我想我可以从一个文件中加载xpath表达式,这个文件的位置可以通过命令行加载,但似乎有一些困难,当一些域的scraping要求我使用regex select(expression_here).re(regex) 而有些则没有。

python screen-scraping scrapy
6个回答
2
投票

在scrapy spider将allow_domains设置为一个域名列表,例如 。

class YourSpider(CrawlSpider):    
   allowed_domains = [ 'domain1.com','domain2.com' ]

希望能帮到你


2
投票

好吧,我面临同样的问题,所以我使用动态创建spider类。type(),

from scrapy.contrib.spiders import CrawlSpider
import urlparse

class GenericSpider(CrawlSpider):
    """a generic spider, uses type() to make new spider classes for each domain"""
    name = 'generic'
    allowed_domains = []
    start_urls = []

    @classmethod
    def create(cls, link):
        domain = urlparse.urlparse(link).netloc.lower()
        # generate a class name such that domain www.google.com results in class name GoogleComGenericSpider
        class_name = (domain if not domain.startswith('www.') else domain[4:]).title().replace('.', '') + cls.__name__
        return type(class_name, (cls,), {
            'allowed_domains': [domain],
            'start_urls': [link],
            'name': domain
        })

所以说,要为''创建一个蜘蛛。http:/www.google.com'我就做--

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'

希望能帮到你


1
投票

我使用下面的XPath表达式做了类似的事情。

  • '/html/head/title/text()' 对于标题
  • //p[string-length(text()) > 150]/text() 的帖子内容。

1
投票

您可以使用一个空的 allowed_domains 属性来指示scrapy不要过滤任何站外请求。但在这种情况下,你必须小心,只返回来自你的spider的相关请求。


0
投票

你应该使用BeautifulSoup,尤其是当你使用Python的时候。它可以让你在页面中找到元素,并使用正则表达式提取文本。


0
投票

你可以使用start_request方法!

然后你也可以对每个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上阅读这个页面以获得更多信息。

https:/docs.scrapy.orgenlatesttopicsspiders.html#scrapy.spider.Spider.start_requests。

希望能帮到你:)

© www.soinside.com 2019 - 2024. All rights reserved.