Scrapy定向爬虫教程(二)——提取网页内容
来源:互联网 发布:c语言长整型数 编辑:程序博客网 时间:2024/05/29 04:15
本节内容
在这一小结,我将介绍如何使用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 Spiderfrom scrapy.selector import Selectorfrom 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转化为string item['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-8 item_string = str(item).decode("unicode_escape").encode('utf-8') file.write(item_string) file.write('\n') file.close() print item_string #在控制台输出 return item # 会在控制台输出原item数据,可以选择不写
运行
依旧进入项目目录,在终端输入
scrapy crawl heartsong
看一下输出的信息,没问题。
看一下生成的本地文件,也ok。
小结
本部分介绍了页面解析的方法,下一部分将会介绍Scrapy爬取多个网页,也是让咱的爬虫真正爬起来的一部分。结合这两节,你就能将我的论坛上的所有帖子都爬下来了。
- Scrapy定向爬虫教程(二)——提取网页内容
- Scrapy定向爬虫教程(二)——提取网页内容
- Scrapy定向爬虫教程(三)——爬取多个页面
- Scrapy定向爬虫教程(四)——数据存入MongoDB
- Scrapy定向爬虫教程(五)——保持登陆状态
- Scrapy定向爬虫教程(三)——爬取多个页面
- Scrapy定向爬虫教程(一)——创建运行项目和基本介绍
- Scrapy定向爬虫教程(六)——分析表单并回帖
- Scrapy定向爬虫教程(一)——创建运行项目和基本介绍
- Scrapy简明教程(二)——开启Scrapy爬虫项目之旅
- scrapy爬虫获取网页特定内容
- Scrapy爬虫(三)——简易动态网页爬虫
- Python 网络爬虫与信息获取(二)—— 页面内容提取
- 网页爬虫--scrapy入门
- 网页爬虫--scrapy进阶
- 网页爬虫--scrapy入门
- 网页爬虫--scrapy进阶
- 网页爬虫--scrapy进阶
- 出差上海记行
- VC++文件操作之最全篇
- android anr分析记录
- C/C++:__packed
- Java项目开发
- Scrapy定向爬虫教程(二)——提取网页内容
- 树莓派使用 RTL8188CUS芯片 开AP模式
- MFC CWinApp Class成员变量及成员函数
- 常见的CSS布局总结
- html基础
- 赛意 右移
- 《Effective C++》学习笔记——条款44
- QT的显示机制
- ionic之样式bar-dark