上一篇中简单的介绍了scrapy的使用,scrapy爬虫的基本结构,scrapy爬虫的强大远不止如此。本篇进一步探索scrapy爬虫的进阶使用,以爬取CSDN博客内容为例,介绍数据结构化、持久化、xpath定位DOM元素、自定义UA中间件等功能的使用。

首先修改上一篇爬取百度网页的spider文件的代码内容,修改后的代码如下:

import scrapyclass Spider_CSDN(scrapy.Spider):"""docstring for SpiderJSscrapy.Spider""""# spider 的name,每个新建的spider都必须有一个name,此变量是唯一需要定位的实例属性,name = "spider_CSDN"# 允许爬取的域名,若为空则表示爬取所有网址,无限制allowed_domains = ["blog.csdn.net"]# 起始url,爬取的起始点,爬虫开始爬取的入口start_urls = ["https://blog.csdn.net/csd_ct/article/details/109305242"]# 构造函数def __init__(self, *arg, **args):super(Spider_CSDN, self).__init__()# 爬取方法def parse(self, response):self.logger.info(f"response is:{response.text}")

1、结构化数据,items.py文件的使用

items.py文件是创建爬虫模板时,一般会在项目中自动生成,也可以改为其他名字。其作用相当于一个模板文件,主要作用是将爬取到的网页内容变为python的一个类,已到达数据结构化的目的。假设我们需要CSDN博客中的['author', 'authorLevel', 'authorRank', 'category', 'collectionsCount', 'commentsCount', 'content', 'fansCount', 'keyWords', 'likesCount', 'publishTime', 'requestUrl', 'title', 'viewsCount', 'webPortal']等内容,items.py文件如下:

class CsdnBlogItem(scrapy.Item):# define the fields for your item here like:# blog 标题title = scrapy.Field()# 来源的门户网站webPortal = scrapy.Field()# URLwebUrl = scrapy.Field()# 作者author = scrapy.Field()# 关键词keyWords = scrapy.Field()# blog 内容content = scrapy.Field()# 粉丝fansCount = scrapy.Field()# 获赞likesCount = scrapy.Field()# 评论commentsCount = scrapy.Field()# 分类category = scrapy.Field()# 收藏数collectionsCount = scrapy.Field()# 访问量viewsCount = scrapy.Field()# 发表时间publishTime = scrapy.Field()# 作者排名authorRank = scrapy.Field()# 作者等级authorLevel = scrapy.Field()# 任务idcrawlTask_id = scrapy.Field()# 爬取时间crawlTime = scrapy.Field()

2、XPATH定位DOM元素

在爬取到网页内容后,我们使用XPATH定位网页元素,并依次按照items.py中定义的结构获取元素值。XPATH主要是为了在XML文档中快速的查找信息, 最初设计是用来搜寻XML文档的,但是它同样适用于 HTML 文档的搜索。详细介绍及使用可参考学【爬虫利器XPath,看这一篇就够了】。这里只需要留意2个简单的语法即可,即元素的定位和值的获取。我们可以利用前面提到的scrapy shell 命令调试xpath的语法。以https://blog.csdn.net/csd_ct/article/details/109305242为例。

在命令行中输入:

scrapy shell https://blog.csdn.net/csd_ct/article/details/109305242

结果如下图:

首先测试下,利用xpath获取博客的标题。可以利用浏览器的dev-tool工具,按下F12键,检查页面元素,找到博客标题如图:

可以看到标题的的dom节点元素是h1,class为title-article,id为articleContentId,id 属性选取节点最为方便。在打开的shell命令行中,输入

response.xpath("//h1[@id='articleContentId']").extract()

返回结果是:

已经选取到了h1标题节点。可以看到返回的是一个数组,且只有一个元素,因为使用id属性来选取的,因为id是唯一的,所以选取了一个元素。要想获得元素的文本值,在xpath路径中添加text()函数即可,如图

如果以class或者其他的属性来选取,则可能会有多个值,如选取class为text-center的元素,

输入:response.xpath("//dl[@class='text-center']").extract(),则有:

可以看到选中的这些内容是左上角的作者信息等级、排名、评论、收藏数等内容。这里第一个dl标签中含有a标签,获取a标签的href链接url,是一个较常用的操作,在xpath选取a标签叫@href可以获取url值。如图:

3、数据持久化操作

结合items中定义的数据模板和xpath的定位操作,在爬虫的parse的函数中,依次选取各个元素的值,复制给item中的项。代码如下:

 def csdnParseBlog(self, response):'''解析CSDN博客页面中的内容'''contentItem = CsdnBlogItem()# 请求URLcontentItem['webUrl'] = response.url.strip().split('?')[0]# 文章标题try:contentItem['title'] = response.xpath("//h1[@id='articleContentId'][1]/text()").extract()[0].strip()except Exception as identifier:contentItem['title'] = ''# 作者信息pInfo = response.xpath("//div[@class='data-info d-flex item-tiling']//dl[@class='text-center']/attribute::title").extract()# 门户网站 名称contentItem['webPortal'] = "CSDN"# blog 作者try:contentItem['author'] = response.xpath("//div[@class='bar-content']//a[@class='follow-nickName']/text()").extract()[0].strip()[0:45]except Exception as identifier:contentItem['author'] = ''self.log(traceback.format_exc(), logging.ERROR)# 发表时间try:contentItem['publishTime'] = response.xpath("//div[@class='bar-content']//span[@class='time']/text()").extract()[0].strip()except Exception as identifier:contentItem['publishTime'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self.log(traceback.format_exc(), logging.ERROR)# 浏览量try:tmp = response.xpath("//div[@class='bar-content']//span[@class='read-count']/text()").extract()[0].strip()contentItem['viewsCount'] = 0 if len(tmp) <= 0 else tmpexcept Exception as identifier:contentItem['viewsCount'] = 0self.log(traceback.format_exc(), logging.ERROR)# 收藏数try:tmp = response.xpath("//div[@class='bar-content']//span[@class='get-collection']/text()").extract()[0].replace(" ", '').strip()contentItem["collectionsCount"] = 0 if len(tmp) <= 0 else tmpexcept Exception as identifier:contentItem['collectionsCount'] = 0self.log(traceback.format_exc(), logging.ERROR)# 点赞数try:tmp = response.xpath("//span[@id='spanCount']/text()").extract()[0].strip()contentItem['likesCount'] = 0 if len(tmp) <= 0 else tmpexcept Exception as identifier:contentItem['likesCount'] = 0self.log(traceback.format_exc(), logging.ERROR)# 评论数try:tmp = response.xpath("//li[@class='tool-item tool-active tool-item-comment']//span[@class='count']/text()").extract()[0].strip()contentItem['commentsCount'] = 0 if len(tmp) <= 0 else tmpexcept Exception as identifier:contentItem['commentsCount'] = 0self.log(traceback.format_exc(), logging.ERROR)# 粉丝数目try:contentItem['fansCount'] = pInfo[6].strip()except Exception as identifier:contentItem['fansCount'] = 0self.log(traceback.format_exc(), logging.ERROR)# 总排名try:contentItem['authorRank'] = pInfo[2].strip()except Exception as identifier:contentItem['authorRank'] = 0self.log(traceback.format_exc(), logging.ERROR)# 等级try:contentItem['authorLevel'] = re.findall(r"\d+", pInfo[4])[0].strip()except Exception as identifier:contentItem['authorLevel'] = 0self.log(traceback.format_exc(), logging.ERROR)# 文章内容try:contentItem['content'] = response.xpath("//div[@id='content_views']").extract()[0].strip()except Exception as identifier:contentItem['content'] = ""self.log(traceback.format_exc(), logging.ERROR)# blog 类别try:contentItem['category'] = response.xpath('//div[@class="tags-box artic-tag-box"]//a/text()').extract()[0].replace(" ", '').strip()[0:18]except Exception as identifier:contentItem['category'] = ''self.log(traceback.format_exc(), logging.ERROR)# 关键词try:contentItem['keyWords'] = response.xpath('//div[@class="tags-box artic-tag-box"]//a/text()').extract()[1].strip()[0:18]except Exception as identifier:contentItem['keyWords'] = ''self.log(traceback.format_exc(), logging.ERROR)if len(contentItem['keyWords']) == 0:contentItem['keyWords'] = json.loads(self.customArgs.get('filterArg', '{}')).get('keyWords', '')# 任务idtaskId = self.args.get('_job')contentItem['crawlTask_id'] = taskId# 爬取时间contentItem['crawlTime'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self.logger.info(f"item data is:{contentItem}")yield contentItem

yield contentItem 这一句不要忘记了, 这一句相当于把contentItem添加到了管道中。对后面数据的处理极为重要,否则,在pipline中数据的处理操作不会被执行。输出结果如下:

scrapy 爬虫之爬取CSDN博客(一)相关推荐

  1. python爬虫爬取csdn博客专家所有博客内容

    python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 #coding:utf-8import urlli ...

  2. 【爬虫+数据可视化】Python爬取CSDN博客访问量数据并绘制成柱状图

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业及非法用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/ ...

  3. 大屏监控系统实战(6)-爬虫初探:爬取CSDN博客之星年度总评选投票统计数据

    一.介绍 我们先来做个简单的,我们的目标是爬取CSDN博客之星年度总评选的首页信息. 首页的地址:http://m234140.nofollow.ax.mvote.cn/wxvote/43ced329 ...

  4. Python爬虫小实践:使用BeautifulSoup+Request爬取CSDN博客的个人基本信息

    好久都没有动Python了,自从在网上买了<Python网络数据采集>这本书之后一直没有时间写自己的小的Demo,今天再网络上无意中看见 http://www.cnblogs.com/mf ...

  5. C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章

    话不多说,先看程序运行截图: 注意: 本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写. 程序思路如下: 1.下载要爬网站的页面. 2.用正 ...

  6. Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法

    目录 lxml库 lxml基本用法 解析XML文件 解析HTML文件 XPath 什么是XPath XPath语法 XPath实战 选取某节点的所有子孙节点 选取某节点的所有子节点 通过属性选取某节点 ...

  7. python实战系列之爬取CSDN博客之星2020年度排名情况(附源码)

    前言 CSDN2020年度博客之星马上就要收尾了,你知道自己关注的博主排名实时变化吗?谁是你心目中的博客之星,让我们爬取各位博主的排名及各位博主的一些个人信息. 代码 直接上代码 # -*- codi ...

  8. 用selenium爬取csdn博客文章,并用4种方法提取数据

    为了方便susu学习selenium,下面代码用selenium爬取博客文章的标题和时间,并用selenium自带的解析,etree,bs4,scrapy框架自带的selector等4种方式来解析网页 ...

  9. 使用selenium爬取csdn博客

    爬取的基本原理是:使用代码控制浏览器,让浏览器加载出页面后,把页面的源代码抓取下来 这篇博客的思路是: 基本环境搭建 核心代码与解释 工具类的代码与解释 一. 基本环境搭建 这里建议使用豆瓣源进行安装 ...

  10. python爬虫--小白爬取csdn页面题目与链接

    爬取csdn页面题目与链接 前言 随着人工智能的不断发展,爬虫这门技术越来越重要-哈哈哈,太过官方.新手小白,过程较曲折,代码较不专业,欢迎批评与指教! 进入正题:本文主要爬取csdn博客某专栏下的题 ...

最新文章

  1. Linux下的Shell工作原理
  2. drbd配置文件详解
  3. 抖音出现大量“三岁用户”,马化腾李彦宏都被还童
  4. python一只青蛙一次可以_青蛙王子 儿童睡前故事 格林童话
  5. python高级语法-GUI编程(主要介绍tkinter)
  6. JSF JQUERY 使用datepicker
  7. 三维全景导航、偏航识别、深度学习偏航引擎,滴滴导航若干关键功能的技术突破与实践...
  8. java 对象地址_如何获取Java对象的地址?
  9. oracle物理索引结构,oracle学习笔记(6)oracle物理结构--索引
  10. [导入]在asp.net中实现观察者模式,或有更好的方法(续)
  11. Linux 二进制分析
  12. 【网络安全基础】数字签名原理及应用
  13. 【C语言】扫雷游戏(包含递归展开、手自动标记功能)
  14. mysql timestamp 差值_SQL计算timestamp的差值实例分享
  15. 快到假期了,还抢不到票?可以试试这两个工具
  16. pdf转换成jpg转换器的使用方法
  17. 雷达模拟器-监控摄像机模拟软件 SPx Video Simulator
  18. 分享一份软件测试项目(Python项目)
  19. 使用Latex排版选择题试卷
  20. S7-1500 PLC编程

热门文章

  1. 前端技术—CSS常用代码大全
  2. linux makefile教程,Makefile简单入门教程
  3. 第一个python程序:爬虫下载课件
  4. Nachos-Lab1-完善线程机制
  5. SCRT同网段的ping不通
  6. 如何利用极域电子教室软件漏洞干翻所有机房
  7. SWAT模型在水文水资源、面源污染模拟中的实践技术应用
  8. vue3中json编辑器
  9. 马尔科夫模型与隐马尔科夫模型
  10. 合并排序时间复杂度推导