您的位置:首页 > 编程语言 > Python开发

读书笔记(九)——python的scrapy框架爬取福建新闻网

2017-08-24 00:00 585 查看
摘要: 看得博客越多,越感觉一篇高质量的博客是需要花费许多时间写的,不论是从基层代码还是编程思路,都是非常的清晰,详细的。庆幸自己只敢写个读书笔记,不敢随便扯虎皮扛大旗,有多少能力做多少事情。不足的地方,敬请指正。

这次因为离开了爬虫许久,想学学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