scrapy爬虫获取网页特定内容
2015-04-02 17:57
253 查看
上次把scrapy环境配置好了,这次试着来做些实际的东西。
关于scrapy抓取网页的文章已经有很多了,但大多数的内容已经过期,不再适用于最新的scrapy版本,故在此另作一文,记录学习过程。
目标是一个政府网站,红框内的部分。
思路很简单:
有了url之后,用xpath表达式提取出来,再写到文件里即可
如果之前没有scrapy的经验,可以先看看这两篇文章:
http://www.cnblogs.com/txw1958/archive/2012/07/16/scrapy-tutorial.html
教你快速上手一个scrapy项目
以及
http://www.ituring.com.cn/article/114408
教你从豆瓣上抓取电影信息
值得注意的是,第二篇文章里的有些方法已经不推荐使用,这里做了改进
talk is cheap,show me the code:
下面来分析代码:
这里是基于单个页面的抓取,因此使用BaseSpider,基于链接跳转的爬虫可以看一下第二篇文章
start_urls就是主域名,
因此allowed_domain设置为空
这个markdown编辑器缩进有点问题,titles.extend…这一行应该和上面一行保持同一缩进,不然会报出
Python运行错误,raise notImplementedError
当遇到这种错误时,检查下缩进,一般就能解决
接下来看xpath表达式,
具体含义为:找到class属性为”Work_News_line”的div,其下面的
关于xpath的使用,还有一些需要注意的地方
在上面第二篇文章中,使用xpath的方式是:
新版本的scrapy不建议这样使用
因此我改成了上面的写法
接下来是最头疼的中文显示问题了
在shell里面看看xpath的查询结果:
一堆Unicode字符,其实这样也算抓取成功了,但基本上不可用,还是需要将其转化成中文。
感觉scrapy,乃至python在字符集这一块做得都不是很好,
再来看上面的代码:
这里声明了一个列表,每查询到一个值,就将其放到列表里,然后需要将这个列表转成字符串写入文件。
python本身提供了
具体见这篇帖子:str字符串转化
有一种解决办法是利用python自带的json模块
这样就ok
我们把抓到的数据写到了文件里面,下面看看结果:
关于scrapy抓取网页的文章已经有很多了,但大多数的内容已经过期,不再适用于最新的scrapy版本,故在此另作一文,记录学习过程。
目标是一个政府网站,红框内的部分。
思路很简单:
有了url之后,用xpath表达式提取出来,再写到文件里即可
如果之前没有scrapy的经验,可以先看看这两篇文章:
http://www.cnblogs.com/txw1958/archive/2012/07/16/scrapy-tutorial.html
教你快速上手一个scrapy项目
以及
http://www.ituring.com.cn/article/114408
教你从豆瓣上抓取电影信息
值得注意的是,第二篇文章里的有些方法已经不推荐使用,这里做了改进
talk is cheap,show me the code:
#coding=utf-8 import sys from scrapy.spider import BaseSpider from scrapy.selector import Selector from scrapy.contrib.spiders import CrawlSpider,Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor import json reload(sys) sys.setdefaultencoding('utf8') class DmozSpider(BaseSpider): name = "dmoz" allowed_domains=[""] start_urls=["http://www.jjkjj.gov.cn/"] def parse(self,response): 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设置为空
def parse(self,response): 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定向爬虫教程(二)——提取网页内容
- Python分布式爬虫前菜(1):关于静态动态网页内容获取的N种方法
- 【java爬虫】HttpClient4.5获取网页内容
- 爬虫学习之第一次获取网页内容及BeautifulSoup处理
- Perl爬虫--爬特定内容的网页
- 基于HttpClient、Jsoup的爬虫获取指定网页内容
- scrapy框架中利用xpath获取网页内容为空,而xpath书写完全正确
- python爬虫获取网页内容
- 基于apache —HttpClient的小爬虫获取网页内容
- 关于scrapy新闻爬虫,对新闻网页内容进行编辑的问题
- 爬虫学习一 : 打开特定网页获取信息
- [code]使用正则获取网页里的特定内容
- Scrapy:Python实现scrapy框架爬虫两个网址下载网页内容信息——Jason niu
- Winnet获取网页HTML内容-Code
- javascript使用xmlhttp获取网页内容
- 不错的用外部Javascript修正特定网页内容
- asp.net 获取远程网页内容
- 获取网页内容