文档章节

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

hei_6775
 hei_6775
发布于 2017/08/24 16:45
字数 1468
阅读 36
收藏 0

这次因为离开了爬虫许久,想学学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')来处理问题,使之中文化。

最后结果输出的标题和简介,还有存储的图片:

© 著作权归作者所有

hei_6775
粉丝 10
博文 21
码字总数 26327
作品 0
福州
程序员
私信 提问
一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者
2018/04/25
0
0
小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验

引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网页以获取我们需要的数据。 对于经常重复用到的代码,我们都会单独抽取成自己的模块,...

coder_pig
2018/07/04
0
0
python从零学——scrapy初体验

python从零学——scrapy初体验 近日因为一些事情,需要从网上爬取一些东西,故而想通过使用爬虫来顺便学习下强大的python。现将一些学习中遇到的问题记录下来,以便日后查询 1. 开发环境的准...

咾咔叽
2018/07/15
32
0
Python爬虫如何快速上手,并达到爬取大规模数据的水平

互联网的数据爆炸式的增长,而利用 Python 爬虫我们可以获取大量有价值的数据: 1.爬取数据,进行市场调研和商业分析 爬取知乎优质答案,筛选各话题下最优质的内容; 抓取房产网站买卖信息,...

技术小能手
2018/06/28
0
0
7个Python爬虫实战项目教程

有很多小伙伴在开始学习Python的时候,都特别期待能用Python写一个爬虫脚本,实验楼上有不少python爬虫的课程,这里总结几个实战项目,如果你想学习Python爬虫的话,可以挑选感兴趣的学习哦;...

实验楼
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
4
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0
重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读《学习JavaScript数据结构与算法-第三版》的系列文章,主要讲述队列数据结...

胡哥有话说
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部