6

我有大约 10 个奇怪的站点,我想从中获取信息。其中一些是 wordpress 博客,它们遵循相同的 html 结构,尽管具有不同的类。其他的要么是论坛,要么是其他格式的博客。

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

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

我想我可以从一个文件中加载 xpath 表达式,该位置可以通过命令行加载,但是在抓取某些域时似乎有些困难,需要我使用正则表达式select(expression_here).re(regex),而有些则不需要。

4

6 回答 6

2

在 scrapy spider 将 allowed_domains 设置为域列表,例如:

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

希望能帮助到你

于 2011-06-11T05:18:19.643 回答
2

好吧,我遇到了同样的问题,所以我使用动态创建了蜘蛛类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'

希望这可以帮助

于 2013-11-25T07:55:20.917 回答
1

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

于 2011-12-23T22:38:22.740 回答
1

我使用以下 XPath 表达式做同样的事情:

  • '/html/head/title/text()'为标题
  • //p[string-length(text()) > 150]/text()对于帖子内容。
于 2011-06-03T21:13:54.203 回答
0

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

于 2011-04-01T01:17:01.963 回答
0

您可以使用 start_request 方法!

然后您也可以优先考虑每个网址!然后最重要的是,您可以传递一些元数据!

这是一个有效的示例代码:

"""
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.org/en/latest/topics/spiders.html#scrapy.spider.Spider.start_requests

希望这可以帮助 :)

于 2020-06-10T17:40:29.237 回答