开始爬取网页:(2)写入源文件的爬取

  为了使代码易于修改,更清晰高效的爬取网页,我们将代码写入源文件进行爬取。

  主要分为以下几个步骤:

    一.使用scrapy创建爬虫框架:

    二.修改并编写源代码,确定我们要爬取的网页及内容

    三.开始爬取并存入文件(数据库)

注:为了避免冗长的叙述,更直观地理解,这里先讲具体的操作方法,如果想要深入理解其原理,具体解释在最后。

*操作方法:

  1.创建爬虫框架

  打开命令行,使用cd命令,进入你想要创建文件的位置

  scrapy startproject 文件夹名称(假设为demo)

    scrapy startproject demo

  强大的scrapy会在当前路径下自动生成爬虫框架如下:demo/

      scrapy.cfg						#项目配置文件
   demo/
   __init__.py
   items.py           #设定数据存入的对象
   pipelines.py         #与数据库交互
   settings.py #爬虫配置文件
   spiders/
   __init__.py
  2.编辑源代码,确定爬取方案
  scrapy不仅仅帮助我们生成好了框架,还提供了很多内置的方法供我们使用,我们只需要利用这些方法并结合BeautifulSoup库
进行网页信息的筛选。   开始写代码吧!
  首先打开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 DemoItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
#pass
  然后在spider目录下新建spider.py,将下述代码复制到其中
 # -*- coding: utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
from demo.items import DemoItem class demo(scrapy.Spider):
name = "demo"
start_urls = ['http://www.cnblogs.com/KoalaDream/'] def parse(self, response):
soup = BeautifulSoup(response.body)
tmp=soup.find_all('div',attrs={'class':'postTitle'})
for i in range(0,len(tmp)):
item=DemoItem()
item['name']=tmp[i].text.encode('utf-8')
yield item

  这段代码的作用是爬取我的博客主页的文章标题,具体语句的作用在后面有介绍。

  3.开始爬取并存入文件

    代码编写好了,我们要开始爬取网页了,是不是很容易?

    在命令行中,使用cd命令进入scrapy.cfg所在的目录

      scrapy crawl demo -o output.json

    开始爬取,并将内容输出到含有scrapy.cfg文件的目录下output.json文件中 

  完成!

  打开output.json文件,什么?怎么全是乱码?

  这是因为我们爬取下的中文字符,以unicode的编码格式存储在文件中。

  想要看到中文字符,可以将输出的内容复制,打开python,输入print u"---"将复制的unicode码粘贴,便可输出对应的中文字符。

*代码详解

  首先,设置编码格式为utf-8,能够显示中文注释。

  在spider中,scrapy框架规定其中有三个必需的定义的成员。

    name: 名字,spider的标识,我们爬取时在命令行中输入的 scrapy crawl ____ 即为此处定义的name

    start_urls:一个url列表,spider从这些网页开始抓取

    parse():一个方法,当start_urls里面的网页抓取下来之后scrapy会自动调用这个方法解析网页内容。

  总的来说就是name告诉scrapy框架,我要运行哪个框架。然后scrapy会运行该框架,自动链接到start_url的web页面,生成response对象,将爬取下源代码存入response对象里面。

  下面我们来看具体的parse()方法是如何工作的。

  首先引入BeautifulSoup库,它可以大大简化我们的爬取过程。

  然后我们打开要爬取的网页即 http://www.cnblogs.com/KoalaDream/

  查看源代码。(chrome浏览器中,鼠标右键点击某一个文章标题,点击审查元素)

  可以看到,每一个标题都是在一个<div>标签里面,class属性均为postTitle

  于是,我们使用BeautifulSoup中提供的方法筛选出标题

    tmp=soup.find_all('div',attrs={'class':'postTitle'})

  将标题以列表的形式存入tmp中。

  还记得我们刚刚修改过的items.py文件吗?

  下面我们要遍历tmp中的每一项,并将其存入刚刚定义过的item中。

  通过 item=DemoItem(),创建了一个DemoItem类的对象,下面的操作

    item['name']=tmp[i].text.encode('utf-8')

  左侧的运算符有些让人费解。因为想要操作类中的成员,一般使用item.name,这个操作符是怎么回事呢?

  仔细观察items.py文件中,DemoItem类继承了scrapy.Item类。经试验证明,如果把继承去除,此运算符不再存在。

  说明在scrapy.Item类中,对运算符[]进行了重载。个人感觉意义上和.操作符没什么区别,我们直接使用此语法即可。

  最后就是 yield item了

  yield语法查了很久,已经被生成器,迭代器搞得有些晕。

  如果想了解具体的yield语法,请看下面的链接  

  http://www.oschina.net/translate/improve-your-python-yield-and-generators-explained

  对于这里的yield语句的作用,我说说我的理解,哪里不准确希望大家多多指教。

  首先简单介绍下yield语句:

  yield用于函数,就像return,给函数一个返回值。不同的是,return标志着函数结束,而yield是让函数暂停,直到这个函数再次被调用,会从暂停的地方继续执行,而不是从头开始。

  在spider.py的代码中,每循环一次,yield语句将列表中当前的值返回给parse。可是我们并没有主动调用和返回。那么输出的内容是哪里来的?

  因为parse是在scrapy框架中,自动被调用的方法,我们可以推测出:

  当告诉scrapy输出到output.json文件中时,对于每一次yield的返回值,会被自动print到output.json文件中。然后scrapy会再次调用parse方法,从刚刚间断的位置,即for循环的下一个列表项开始。如此循环,直到函数结束。这样一来,tmp中的内容就被存放到item['name']中,然后被输出到output.json中。

  每一次yield返回的一个值就是所谓的生成器。

  而每一次从暂停状态,再被调用时,自动从暂停前的下一个对象开始,就是所谓的迭代器。

  附:官方文档

    Scrapy  http://doc.scrapy.org/en/latest/

scrapy爬虫笔记(三)------写入源文件的爬取的更多相关文章

  1. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  2. scrapy爬虫框架教程(二)-- 爬取豆瓣电影

    前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大家讲解一个完整爬虫的流程. 工具和环境 语言:python 2 ...

  3. scrapy爬虫系列之二--翻页爬取及日志的基本用法

    功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...

  4. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  5. python爬虫(三) 用request爬取拉勾网职位信息

    request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...

  6. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  7. scrapy框架基于CrawlSpider的全站数据爬取

    引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...

  8. [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息

    [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫   版权声明: ...

  9. Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)

    Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...

随机推荐

  1. linux零基础入门总结

    啊,notepad++贴过来怎么对齐格式这么糟糕呢? #root用户 $普通用户   linux命令 清屏clear翻页清屏  CRT中ctrl+L    reset"清空 CRT中不起作用 ...

  2. ios图文混排

    图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...

  3. 非常简单的升级phpnow自带的php版本到5.3的方法

    下载PHP5.3 下载地址百度一下“PHP5.3下载”就有很多网站提供下载的,也可以去官网下载最新的,记得下载ZIP压缩的噢 2 解压与命名 将下载的PHP5.3压缩包解压至phpnow的安装目录,命 ...

  4. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  5. BZOJ 4723: [POI2017]Flappy Bird

    Description 从一个点到一条直线,每次纵坐标只能增加或减少1,有些位置有障碍,求最少增加步数. Sol 贪心. 或许是贪心吧...反正在可到达的范围内,纵坐标尽量小... 做的时候维护一下两 ...

  6. 【Maven】Eclipse安装Maven插件后导致Eclipse启动出错

    本文纯属复制粘贴:具体请参照原文: Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning.  解决方法: 1. ...

  7. 读书笔记<白帽子讲web安全>

    2016年3月24日 09:34:32 星期四 ddos攻击: 一种: 随机生成ip, 去建立链接, 由于http/tcp握手协议原理, 发送应答报文时因为ip无效会导致等待重发, 这种行为可以通过电 ...

  8. Android错误

    1. [2016-09-16 14:25:45 - X_Card] Found 2 versions of android-support-v4.jar in the dependency list, ...

  9. JdbcTemplate中queryForObject的EmptyResultDataAccessException问题

    在使用Spring提供的JdbcTemplate中名为queryForObject API进行数据库查询时有时会抛出如下异常提示息,org.springframework.dao.EmptyResul ...

  10. POJ 3155 Hard Life(最大密度子图)

    裸题.输入一个无向图,输出最大密度子图(输出子图结点数和升序编号). 看了<最小割模型在信息学竞赛中的应用——胡伯涛>的一部分,感觉01分数规划问题又是个大坑.暂时还看不懂. 参考http ...