scrapy爬虫

背景

抓取古诗文大全_古诗文网的全部内容~

1. 创建

1.1 创建项目

scrapy startproject 项目名称

scrapy startproject gushiwen

1.2 创建模板

scrapy genspider -t crawl 爬虫名称 域名

scrapy genspider -t crawl gushiwen gushiwen.org

在这里插入图片描述
此时d:/crawl下自动生成了模板gushiwen.py
在这里插入图片描述

2. 定义规则

  • LinkExtractor链接提取器:会去起始url响应回来的页面中提取指定的url
  • rules元组中存放的是不同的规则解析器(封装好了某种解析规则)
  • 规则解析器:根据链接提取器中提取到的链接,根据指定规则提取解析器链接网页中的内容。
参数名参数含义
allow提取符合对应正则表达式的链接
deny不提取符合对应正则表达式的链接
restrict_xpaths使用xpath表达式与allow共用作用提取出同时符合对应xpath表达式和对应正则表达式的链接
allow_domains允许提取的域名,比如我只想提取某个域名下的链接时候会使用
deny_domains禁止提取的域名,比如我需要限制一定不提取某个域名下的链接时会使用

在这里插入图片描述

3. 解析页面

明确我们要提取的字段,这里我需要的是体裁、标题、朝代、作者、内容;于是,打开items.py上定义一个类:
在这里插入图片描述
然后在模板gushiwen.py中引入该类

from gushiwen.items import GushiwenItem

分析网页,确定每个字段的xpath后,我们就可以在parse_item()方法里面开始提取内容了

    def parse_item(self, responAse):
        item = GushiwenItem()
        divs = response.xpath('//div[@class="sons"]')
        nums = len(divs)
        for i in range(nums):
            d = response.xpath('/html/body/div[2]/div[1]/div['+str(2*i+1)+']')
            item["genre"] = ""
            try:
                item["title"] = d.xpath('./div[1]/p[1]/a/b/text()').extract()[0].strip()
            except:
                continue
            try:
                item["dynasty"] = d.xpath('./div[1]/p[2]/a[1]/text()').extract()[0].strip()
            except:
                continue
            try:
                item["author"] = d.xpath('./div[1]/p[2]/a[2]/text()').extract()[0]
            except:
                continue
            
            content = ''
            for p in d.xpath('.//div[@class="contson"]//p/text()'):
                content = content + p.extract().strip()
            if content == '':
                content = d.xpath('.//div[@class="contson"]/text()').extract()[0].strip()
            item["content"] = content
            yield item  # 将item提交至管道

在这里插入图片描述

4. 保存结果

在管道文件pipelines.py中实现item的处理process_item。这里我是把它写入txt里面,用制表符分割每个字段。我们也可以在这个文件里面多写几个类,诸如写入json文件、csv文件的类,然后调用的时候换成这些类就行。
在这里插入图片描述
关键一步:还需要在设置setting.py里面调用pipelines的这个类,setting.py里面已经写好了,我们只需要取消注释就行。
在这里插入图片描述

5. 执行爬虫

scrapy crawl 爬虫名称

我在“D:\crawl”路径执行程序没有成功,将模板文件gushiwen.py复制“D:\crawl\gushiwen\gushiwen\spiders”里面,将路径切换到“D:\crawl\gushiwen”执行命令就跑通了:

scrapy crawl gushiwen

程序在跑的时候就有输出文件生成了,等爬完了去验收就ok了!
在这里插入图片描述

错误总结

  1. 一开始不熟悉,我既想提取下一页,但是在allow=sublink那里又把网页规定只能局限在第一页,难怪一直翻页不了。。。后来,我看文言文那里一共有60页,就想把提取下一页的规则解析器注释掉,直接在sublink=“default_4A111111111111A[1-60].aspx”。发现结果还是少了一些,仔细分析才知道并非每个页面都是"default_4A111111111111A开头的,像文言文第40页就不是了。
    在这里插入图片描述
  2. 因为提取的内容有些前后自带换行符,以至于我写出的txt文件有些行的正文content字段跳到下一行。本来想手工调整,后来觉得实在太多了,于是在代码里对str字段加上strip()方法就轻松解决了。
  3. xpath语法要掌握好,一开始//和/分不清,走了不少弯路。建议用xpath时候先学习参考教程最后一篇,少走弯路。

代码

yingtingHuang/scrapy_crawl: scrapy爬虫
https://github.com/yingtingHuang/scrapy_crawl

参考教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值