scrapy爬虫获取网页特定内容

上次把scrapy环境配置好了,这次试着来做些实际的东西。 关于scrapy抓取网页的文章已经有很多了,但大多数的内容已经过期,不再适用于最新的scrapy版本,故在此另作一文,记录学习过程。 目标是一个政府网站,红框内的部分。

思路很简单: 有了url之后,用xpath表达式提取出来,再写到文件里即可

如果之前没有scrapy的经验,可以先看看这两篇文章: 教你快速上手一个scrapy项目 以及 教你从豆瓣上抓取电影信息

值得注意的是,第二篇文章里的有些方法已经不推荐使用,这里做了改进

talk is cheap,show me the code:

#coding=utf-8 import sys from scrapy.spider import BaseSpiderfrom scrapy.selector import Selectorfrom scrapy.contrib.spiders import CrawlSpider,Rulefrom scrapy.contrib.linkextractors.sgml import SgmlLinkExtractorimport jsonreload(sys) sys.setdefaultencoding(‘utf8’) :name = “dmoz”allowed_domains=[“”]start_urls=[“http://www.jjkjj.gov.cn/”]:filename = response.url.split(“/”)[-2]titles=[]titles.extend(response.selector.xpath(‘//div[@class =”Work_News_line”]/a/text()’).extract())open(filename,’w’).write(json.dumps(titles, encoding=”gb2312″, ensure_ascii=False))

下面来分析代码:

from scrapy.spider import BaseSpider

这里是基于单个页面的抓取,因此使用BaseSpider,基于链接跳转的爬虫可以看一下第二篇文章

name = “dmoz”allowed_domains=[“”]start_urls=[“http://www.jjkjj.gov.cn/”]

start_urls就是主域名, 因此allowed_domain设置为空

:filename = response.url.split(“/”)[-2]titles=[]titles.extend(response.selector.xpath(‘//div[@class =”Work_News_line”]/a/text()’).extract())

这个markdown编辑器缩进有点问题,titles.extend…这一行应该和上面一行保持同一缩进,不然会报出 Python运行错误,raise notImplementedError

当遇到这种错误时,检查下缩进,一般就能解决 接下来看xpath表达式, 具体含义为:找到class属性为”Work_News_line”的div,其下面的<a>标签的值

extract()函数 返回一个unicode字符串,该字符串为XPath选择器返回的数据

关于xpath的使用,还有一些需要注意的地方 在上面第二篇文章中,使用xpath的方式是:

sel=Selector(response)item=DoubanmoiveItem()item[‘name’]=sel.xpath(‘//[@id=”content”]/h1/span[1]/text()’).extract()

新版本的scrapy不建议这样使用

因此我改成了上面的写法

接下来是最头疼的中文显示问题了 在shell里面看看xpath的查询结果:

一堆Unicode字符,其实这样也算抓取成功了,但基本上不可用,还是需要将其转化成中文。 感觉scrapy,乃至python在字符集这一块做得都不是很好, 再来看上面的代码:

titles=[]titles.extend(response.selector.xpath(‘//div[@class =”Work_News_line”]/a/text()’).extract())

这里声明了一个列表,每查询到一个值,就将其放到列表里,,然后需要将这个列表转成字符串写入文件。 python本身提供了str()方法,用于将任意对象转换成字符串,但没有对中文提供支持,转出来的字符串还是unicode编码。 具体见这篇帖子:str字符串转化 有一种解决办法是利用python自带的json模块

open(filename,’w’).write(json.dumps(titles, encoding=”gb2312″, ensure_ascii=False))

这样就ok

我们把抓到的数据写到了文件里面,下面看看结果:

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。

scrapy爬虫获取网页特定内容

相关文章:

你感兴趣的文章:

标签云: