Scrapy定向爬虫教程(二)——提取网页内容
本节内容
在这一小结,我将介绍如何使用Scrapy通过Selector选择器从网页中提取出我们想要的内容,并将这些内容存放到本地文件。
我们的目标网页是http://www.heartsong.top/forum.php?mod=viewthread&tid=8,一个有七层楼的帖子。我们要获取到每一层楼的下列信息:
- 所属主题帖的标题
- 所属主题帖的url
- 这一楼层的作者
- 这一楼层的发表时间
- 这一楼层的内容
Selector选择器
在Scrapy中,也可以使用BeautifulSoup来解析网页,但是,我们推荐使用Scrapy自带的Selector选择器来解析网页,没别的原因,效率高。Selector选择器有XPath方法和css方法两种选择方法,我使用的是XPath方法。
XPath
XPath 是一门在 XML 文档中查找信息的语言。因为网上的教程有很多,在此处推荐两个,我自己就不多讲了。一个菜鸟教程的XPath文字教程,一个是极客学院的XPath视频教程,后者需要实名认证一下就可以观看,也不麻烦,个人比较推崇后者,老师讲的很易懂。相信我,根据教程只需要半个小时你就能明白XPath,再根据下面我的代码对照巩固一下,你就能掌握它了。
使用Chrome分析网页
我们使用Chrome浏览器(firefox也是类似的)来分析网页,分析我们的XPath该怎么去写,比如说我们现在要分析帖子的标题
右键帖子标题,选择检查
此时,Chrome的调试工具会跳出来,并且自动定位到源代码中我们要检查的元素的位置
之后根据代码结构我们很轻松的就得出其XPath
//*[@id="thread_subject"]/text()
其实在某些时候也可以直接右键元素,选择copy xpath,但是这种方法在实践中用处基本为零,因为很难去找出多个网页的共同特质,所以一般情况下我们还是要自己去分析。
在这里有必要提醒一个神坑,在下面代码中也有体现,详见我从前写的这篇文章Scrapy匹配xpath时tbody标签的问题
这个坑给我的启示是,当发现了感觉不能用科学解释的错误的时候,就检查一下获取到的源代码吧!
代码
不说废话了,直接上代码。
首先,修改items.py
文件,定义好我们要提取的内容
# -*- coding: utf-8 -*-import scrapyclass HeartsongItem(scrapy.Item):title = scrapy.Field() # 帖子的标题url = scrapy.Field() # 帖子的网页链接author = scrapy.Field() # 帖子的作者post_time = scrapy.Field() # 发表时间content = scrapy.Field() # 帖子的内容
然后来到heartsong_spider.py
,编写爬虫
# -*- coding: utf-8 -*-# import scrapy # 可以写这句注释下面两句,不过下面要更好
from scrapy.spiders import Spider
from scrapy.selector import Selector
from heartsong.items import HeartsongItem # 此处如果报错是pyCharm的原因class HeartsongSpider(Spider):name = "heartsong"allowed_domains = ["heartsong.top"] # 允许爬取的域名,非此域名的网页不会爬取start_urls = ["http://www.heartsong.top/forum.php?mod=viewthread&tid=8" # 起始url,此例只爬这个页面]def parse(self, response):selector = Selector(response) # 创建选择器table = selector.xpath('//*[starts-with(@id, "pid")]') # 取出所有的楼层for each in table: # 对于每一个楼层执行下列操作item = HeartsongItem() # 实例化一个Item对象item['title'] = selector.xpath('//*[@id="thread_subject"]/text()').extract()[0]item['author'] = \each.xpath('tr[1]/td[@class="pls"]/div[@class="pls favatar"]/div[@class="pi"]/div[@class="authi"]/a/text()').extract()[0]item['post_time'] = \each.xpath('tr[1]/td[@class="plc"]/div[@class="pi"]').re(r'[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+')[0].decode("unicode_escape")content_list = each.xpath('.//td[@class="t_f"]').xpath('string(.)').extract()content = "".join(content_list) # 将list转化为stringitem['url'] = response.url # 用这种方式获取网页的url# 把内容中的换行符,空格等去掉item['content'] = content.replace('\r\n', '').replace(' ', '').replace('\n', '')yield item # 将创建并赋值好的Item对象传递到PipeLine当中进行处理
最后到pipelines.py
中保存爬取到的数据:
# -*- coding: utf-8 -*-import heartsong.settingsclass HeartsongPipeline(object):def process_item(self, item, spider):file = open("items.txt", "a") # 以追加的方式打开文件,不存在则创建# 因为item中的数据是unicode编码的,为了在控制台中查看数据的有效性和保存,# 将其编码改为utf-8item_string = str(item).decode("unicode_escape").encode('utf-8')file.write(item_string)file.write('\n')file.close()print item_string #在控制台输出return item # 会在控制台输出原item数据,可以选择不写
- 1
运行
依旧进入项目目录,在终端输入
scrapy crawl heartsong
看一下输出的信息,没问题。
看一下生成的本地文件,也ok。
小结
本部分介绍了页面解析的方法,下一部分将会介绍Scrapy爬取多个网页,也是让咱的爬虫真正爬起来的一部分。结合这两节,你就能将我的论坛上的所有帖子都爬下来了。
Scrapy定向爬虫教程(二)——提取网页内容相关推荐
- Scrapy定向爬虫教程(三)——爬取多个页面
本节内容 本部分所实现的功能是,批量的爬取网页信息,不再是像以前那样只能下载一个页面了.也就是说,分析出网页的url规律后,用特定的算法去迭代,达到把整个网站的有效信息都拿下的目的. 因为本部分讲完后 ...
- Scrapy定向爬虫教程(一)——创建运行项目和基本介绍
前言 目前网上的Scrapy中文教程比较少,而且大多教程使用的Scrapy版本较老,比如说这个Scrapy 0.25 文档,如其名,上古时期的翻译文档:再比如极客学院的视频教程使用的是1.0.x版本, ...
- [235]scrapy分布式爬虫scrapy-redis(二)
===============================================================Scrapy-Redis分布式爬虫框架================== ...
- Scrapy爬虫教程二 浅析最烦人的反爬虫手段
最近一直在弄爬虫,也爬取了知名网站的一些数据(这里只是个人学习使用,不是商用!!!),大家都知道,爬虫和反爬虫一直以来都是相爱相杀的,爬虫程序员希望破解反爬虫手段,反爬虫程序员希望建立更加有效的反爬虫 ...
- hsweb提取页面查询参数_爬虫入门二-提取信息-正则表达式
Hello,好久没更新了,因为我苦逼的去准备期中考试了,哎,不提了,进入我们今天的正题,提取网页中的信息吧. 上次,我们学会了如何向网站提交一个请求并得到返回的信息. 那么我们如何在这一大串信息中提取 ...
- python requests模块_Python 爬虫教程 requests 模块
经过 前边文章<简单Python爬虫教程 (一)>.简单Python爬虫教程 (二)两篇文章的学习,能写一些比较简单的爬虫了,但是还不够,这一篇文章主要介绍Requests模块,reque ...
- python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)
本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...
- Python 框架 之 Scrapy 爬虫(二)
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取)所设计的, 也可以应 ...
- python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
从本篇开始学习 Scrapy 爬虫框架 Python爬虫教程-30-Scrapy 爬虫框架介绍 框架:框架就是对于相同的相似的部分,代码做到不出错,而我们就可以将注意力放到我们自己的部分了 常见爬虫框 ...
最新文章
- SpringBoot最最最常用的注解梳理
- SAP SD 以PDF格式显示BILLING的输出格式
- 数组的循环右移问题(好未来笔试题)
- 字符串系列函数(不断跟新)
- Java加密与解密的艺术~数字签名~DSA实现
- 史无前例,阿里云或将空降 M7 级高管
- .NET Core RSA 签名和验签(密钥为 16 进制编码)
- jQuery插件开发详细教程
- 四元数和欧拉角在线转换
- BrnShop开源网上商城第三讲:插件的工作机制
- 配置springMVC
- Docker 安装 Java Jdk 8、安装 Vim 编辑器
- zepto在整个屏幕中左滑动右滑动
- 软件架构设计原则--开闭原则
- gitlab使用教程
- EtherCAT之TwinCAT3安装、使用
- 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...
- ueditor 图片水印 php,[UEditor]上传图片自动添加水印
- 计算机大赛横幅标语有趣的,有创意的横幅标语大全
- pandas 中上下两行相减(隔行相减) -- shift函数的使用
热门文章
- pid matlab 温度控制,基于MatlabPID温控系统设计与仿真.doc
- 一个给自己挖坑的网络综合实验(后悔莫及)
- gmod的css模块放哪,gmod模式怎么更换?gmod模块安装步骤教程
- java读取16位深png_读取16位灰度TIFF
- linux nfs 修复文件,linux nfs Read-only file system
- python列表常用操作函数_Python入门——列表常用操作
- java静态多态_Java静态方法不具有多态性详解
- Crfe php,新版中国菜刀(20141213)一句话不支持php assert分析
- python输入一个英文句子、翻转句子中单词的顺序_ODOA(1) 翻转句子中单词的顺序(C语言实现)...
- android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件