读书笔记(九)——python的scrapy框架爬取福建新闻网
2017-08-24 00:00
585 查看
摘要: 看得博客越多,越感觉一篇高质量的博客是需要花费许多时间写的,不论是从基层代码还是编程思路,都是非常的清晰,详细的。庆幸自己只敢写个读书笔记,不敢随便扯虎皮扛大旗,有多少能力做多少事情。不足的地方,敬请指正。
这次因为离开了爬虫许久,想学学Django,发现Django巨难,设计的知识面太多了,html,css,javascript,勉强懂了点,想写个好看的Django,html模版完全只会写最简单的
尴尬,网页贼丑,不忍直视。
许久没有摸摸爬虫,手都生了,随便写一个上上手。
这次我们爬取的是福建新闻网,一个漂亮的静态html,只是练下手,所以并不准备爬取很多数据,简单的爬一些,下载些图片即可,先分析网页源代码:
我们发现“《澳门日报》关注港澳台企业集中挂牌厦门两岸股权交易中心”这一段以及其的图片,简介都是在class='post'处,分别找出标题,图片链接,简介所在位置。但是仅分析一个是无法验证的,再分析下一个:
和之前分析的一样,转到firepath继续分析我们所要的数据的Xpath:
在xpath输入框中输入一下信息,可以看到指向了所有class为post的块中,为了观看效果,截屏时,把页面缩小了。
继续分析:
标题的Xpath,代码的意思是,所有class为post的块下的h2标签下的a标签的文本节点的内容
简介的xpath,这里发现简介里还有class属性,而class属性是唯一的,所以大胆的放心的用:
图片链接的xpath:
好了,前端分析到这边,接下来创建scrapy。这次稍微有点点不同,因为之前在学Django,Django我都是直接放在虚拟机运行,通过Xshell和notepad来控制,脱离繁琐的Linux系统,虽然还是命令之类的都还是Linux的。我们直接创建一个新的虚拟环境,来避免Django项目和我的爬虫的干扰。在Xshell里输入:
之后,Xshell的命令行前会有(VENVGEN)表示实在linux的虚拟环境下,如下图:
然后因为有爬取图片,所以我们需要创建一个图片文件夹来存储图片,在Xshell中输入:
然后着手开始我们的scrapy:
我们要记录的有三条数据,分别是新闻的标题,简介,图片链接,所以在items.py中只需编写三个变量即可:
接下来编写爬虫文件CNMspider.py,extract是为了序列化该节点为Unicode字符串并返回List列表:
pipelines.py是处理数据的部分,由于本次爬虫比较简单,就不需要使用数据库了(总共就几个数据还让我用数据库,那真是爆炸啊):
这里拼接了图片的完整链接,并使用urllib.urlretrieve来下载图片,其中,存储位置由于是Linux系统,所以通过pwd命令可以得到绝对路径:
使用了r''的正则来避免任何转义字符的干扰,接下来就需要在settings.py中开启pipelines的功能了,直接将注释去掉即可,去掉后,如下图:
在Xshell启动爬虫:
在后面加了--nolog就会不输出任何错误及其他系统信息,当时有时,我们需要查看错误,所以也可以使用
来发现错误。
在这篇还有个地方要注意的,因为在linux的虚拟环境下使用的是python2.7版本,所以中文编码可能会有些问题,所以在输出时,如果看到的是如下:
一大串的Unicode编码的,可以使用.encode('utf-8')来处理问题,使之中文化。
最后结果输出的标题和简介,还有存储的图片:
这次因为离开了爬虫许久,想学学Django,发现Django巨难,设计的知识面太多了,html,css,javascript,勉强懂了点,想写个好看的Django,html模版完全只会写最简单的
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <style> .cities { background-color:#696969; color:white; margin:20px; padding:20px; } </style> </head> <body> <div class="cities"> <h2>London</h2> <p> London is the capital city of England. It is the most populous city in the United Kingdom, with a metropolitan area of over 13 million inhabitants. </p> </div> <div class="t2"> <table border='1'> <tr> <td>第一行</td> <td>第二行</td> </tr> </table> <br /> <form>一个帅气的输入框:<br /> <input type = 'text' name='firstname'> <br /> <input type = 'submit',name='second'> <br /> </div> </body> </html>
尴尬,网页贼丑,不忍直视。
许久没有摸摸爬虫,手都生了,随便写一个上上手。
这次我们爬取的是福建新闻网,一个漂亮的静态html,只是练下手,所以并不准备爬取很多数据,简单的爬一些,下载些图片即可,先分析网页源代码:
我们发现“《澳门日报》关注港澳台企业集中挂牌厦门两岸股权交易中心”这一段以及其的图片,简介都是在class='post'处,分别找出标题,图片链接,简介所在位置。但是仅分析一个是无法验证的,再分析下一个:
和之前分析的一样,转到firepath继续分析我们所要的数据的Xpath:
在xpath输入框中输入一下信息,可以看到指向了所有class为post的块中,为了观看效果,截屏时,把页面缩小了。
.//*[@class='post']
继续分析:
标题的Xpath,代码的意思是,所有class为post的块下的h2标签下的a标签的文本节点的内容
.//*[@class='post']/h2/a/text()
简介的xpath,这里发现简介里还有class属性,而class属性是唯一的,所以大胆的放心的用:
.//*[@class='news-detail-span']/text()
图片链接的xpath:
.//*[@class='news-detail-img']/img/@src
好了,前端分析到这边,接下来创建scrapy。这次稍微有点点不同,因为之前在学Django,Django我都是直接放在虚拟机运行,通过Xshell和notepad来控制,脱离繁琐的Linux系统,虽然还是命令之类的都还是Linux的。我们直接创建一个新的虚拟环境,来避免Django项目和我的爬虫的干扰。在Xshell里输入:
mkdir pachong#在创建虚拟环境之前我们创建了一个爬虫文件夹,来放置之后产生的文件 virtualenv VENVGEN#创建名为VENVGEN的虚拟环境 source VENVGEN/bin/activate#激活虚拟环境
之后,Xshell的命令行前会有(VENVGEN)表示实在linux的虚拟环境下,如下图:
然后因为有爬取图片,所以我们需要创建一个图片文件夹来存储图片,在Xshell中输入:
cd pachong#进入pachong文件夹 mkdir img#创建一个空的文件夹img
然后着手开始我们的scrapy:
scrapy startproject CNM#创建一个scrapy工程 cd CNM#进入CNM文件 scrapy genspider -t#查询当前可以使用的爬虫模版 scrapy genspider -t basic CNMspider fj.chinanews.com#使用basic模版创建一个爬虫文件,将存储在spiders文件夹中
我们要记录的有三条数据,分别是新闻的标题,简介,图片链接,所以在items.py中只需编写三个变量即可:
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html import scrapy class CnmItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() generalize = scrapy.Field() img_url = scrapy.Field() pass
接下来编写爬虫文件CNMspider.py,extract是为了序列化该节点为Unicode字符串并返回List列表:
# -*- coding: utf-8 -*- import scrapy from CNM.items import CnmItem class CnmspiderSpider(scrapy.Spider): name = 'CNMspider' allowed_domains = ['fj.chinanews.com'] start_urls = [r'http://www.fj.chinanews.com/'] def parse(self, response): item = CnmItem() item['title'] = response.xpath(r".//*[@class='post']/h2/a/text()").extract() item['generalize'] = response.xpath(r".//*[@class='news-detail-span']/text()").extract() item['img_url'] = response.xpath(r".//*[@class='news-detail-img']/img/@src").extract() yield item#数据返回item
pipelines.py是处理数据的部分,由于本次爬虫比较简单,就不需要使用数据库了(总共就几个数据还让我用数据库,那真是爆炸啊):
# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html import urllib class CnmPipeline(object): def __init__(self): pass def process_item(self, item, spider): for j in range(0,len(item['title'])): title = item['title'][j] generalize = item['generalize'][j] img_url = item['img_url'][j] print title print generalize last_img_url = r'http://www.fj.chinanews.com/'+img_url img_file = r'/home/usual/pachong/img/'+str(j)+'x'+'.jpg' urllib.urlretrieve(last_img_url,filename=img_file) return item
这里拼接了图片的完整链接,并使用urllib.urlretrieve来下载图片,其中,存储位置由于是Linux系统,所以通过pwd命令可以得到绝对路径:
使用了r''的正则来避免任何转义字符的干扰,接下来就需要在settings.py中开启pipelines的功能了,直接将注释去掉即可,去掉后,如下图:
在Xshell启动爬虫:
scrapy crawl CNMspider --nolog
在后面加了--nolog就会不输出任何错误及其他系统信息,当时有时,我们需要查看错误,所以也可以使用
scrapy crawl CNMspider
来发现错误。
在这篇还有个地方要注意的,因为在linux的虚拟环境下使用的是python2.7版本,所以中文编码可能会有些问题,所以在输出时,如果看到的是如下:
一大串的Unicode编码的,可以使用.encode('utf-8')来处理问题,使之中文化。
最后结果输出的标题和简介,还有存储的图片:
相关文章推荐
- Python抓取框架:Scrapy的架构
- Python:Scrapy框架中Item Pipeline组件(项目管道组件)的使用教程
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法
- Python:Scrapy框架中Item Pipeline组件使用详解
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- python框架Scrapy中crawlSpider的使用——爬取内容写进MySQL
- Python项目--Scrapy框架(一)
- python开源爬虫框架scrapy源码解析(四)
- Python安装Scrapy(爬虫)框架
- python爬虫框架之scrapy安装与当当网爬虫实战
- Python开源爬虫框架:Scrapy架构分析
- Python爬虫教程——进阶一之爬虫框架Scrapy安装配置
- Python爬虫框架Scrapy学习一记——认识Scrapy
- Python爬虫框架--Scrapy
- Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息
- Python爬虫框架Scrapy实例
- Python爬虫框架Scrapy实战之抓取户外数据
- Python爬虫框架Scrapy 学习笔记 4 ------- 第二个Scrapy项目
- Scrapy框架学习 - 爬取Boss直聘网Python职位信息