美文网首页
Scrapy 爬虫框架学习记录

Scrapy 爬虫框架学习记录

作者: 捡个七 | 来源:发表于2018-11-19 22:07 被阅读0次

    打算做一个小小的项目,用于下载论文,所以先学学爬虫的一些相关知识。

    创建项目

    安装完 scrapy 后,新建一个爬虫的目录,然后在命令行窗口进入该目录,输入以下命令:

    scrapy startproject projectname
    

    该目录会包含以下内容:

    projectname/
        scrapy.cfg            # 部署配置文件
    
        projectname/          # 项目的Python模块,你将从这里导入你的代码
            __init__.py
    
            items.py          # 项目 items 定义文件
    
            middlewares.py    # 项目 middlewares 文件
    
            pipelines.py      # 项目 pipelines 文件
    
            settings.py       # 项目设置文件
    
            spiders/          # 将在以后放置 spiders 的目录
                __init__.py
    

    创建爬虫

    上面出现的 spiders 里面包含自己定义的类, Scrapy 将用其来爬去网页的信息。spiders 里面定义的类,必须继承 scrapy.Spider 这个类,以及定义一些初始的请求。比如,如何跟踪页面中的链接,以及如何解析下载的页面内容以提取数据。下面是一个爬虫的示例代码,来自官方文档:

    import scrapy
    
    
    class QuotesSpider(scrapy.Spider):
        name = "quotes"
    
        def start_requests(self):
            urls = [
                'http://quotes.toscrape.com/page/1/',
                'http://quotes.toscrape.com/page/2/',
            ]
            for url in urls:
                yield scrapy.Request(url=url, callback=self.parse)
    
        def parse(self, response):
            page = response.url.split("/")[-2]
            filename = 'quotes-%s.html' % page
            with open(filename, 'wb') as f:
                f.write(response.body)
            self.log('Saved file %s' % filename)
    

    如上所示,这个子类定义了一些属性和方法:

    • name:爬虫的名字。在项目中必须是唯一的,也就是说,不能为不同的 Spiders设置相同的名称。
    • start_requests:必须返回一个可迭代的请求(可以返回请求列表或编写生成器函数),这时 Spider 将开始爬行。后续请求将从这些初始请求中连续生成。
    • parse:将被调用以处理为每个请求下载的响应的方法。 response 参数是 TextResponse 的一个实例,它保存页面内容并具有处理内容的其他有用方法。

    启动爬虫

    要让爬虫工作,请转到项目的顶级目录并在命令行窗口输入以下命令,启动爬虫:

    scrapy crawl quotes   ## quotes 是 spider 的 name
    

    将会有下面这样的结果:

    在文件目录下也会生成两个 HTML 文件:

    解释一下刚刚爬虫的过程:Scrapy 安排了 scrapy.Request 对象,其由 Spider 的 start_requests 方法返回。收到每个响应后,它会实例化 Response 对象并调用与请求相关的回调方法(在本例中为 parse 方法),将响应作为参数传递。

    提取数据

    推荐在 scrapy shell 中学习提取数据,可以通过以下方式:

    scrapy shell "http://quotes.toscrape.com/page/1/"
    
    使用 CSS 来提取数据

    如下图所示,是使用 CSS 来提取数据。可以看到结果是一个名为 SelectorList 的类似列表的对象,它表示包含 XML / HTML 元素的 Selector 对象列表,并允许运行更多查询以细化选择或提取数据。

    提取标题的文字内容:

    使用 extract() 返回的是 list 对象,为了提取具体内容可以用 extract_first():

    或者也可以使用切片的方式,但是使用切片的话需要注意 IndexError

    使用 XPath 提取数据

    除了 CSS,Scrapy 选择器还支持使用 XPath 表达式:

    XPath 表达式提供了更多功能,因为除了导航结构之外,它还可以查看内容。使用 XPath,可以选择包含文本 “下一页” 的链接。这使得 XPath 非常适合抓取任务。

    更多内容可以查看:using XPath with Scrapy Selectors

    相关文章

      网友评论

          本文标题:Scrapy 爬虫框架学习记录

          本文链接:https://www.haomeiwen.com/subject/ibrafqtx.html