专栏首页杂七杂八Scrapy爬取数据初识

Scrapy爬取数据初识

Scrapy爬取数据初识

初窥Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

基本步骤

  • 选择一个网站
  • 定义您想抓取的数据
  • 编写提取数据的Spider
  • 执行spider,获取数据
  • 查看提取到的数据

安装

控制台执行命令pip install Scrapy,如果执行过程中出现building'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required.则需要在网站https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted下载whl文件,pip安装,再重新运行pip install Scrapy,即可

image.png

原理

Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。

原理

绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。 组成部分介绍:

  • Scrapy Engine: 负责组件之间数据的流转,当某个动作发生时触发事件
  • Scheduler: 接收requests,并把他们入队,以便后续的调度
  • Downloader: 负责抓取网页,并传送给引擎,之后抓取结果将传给spider
  • Spiders: 用户编写的可定制化的部分,负责解析response,产生items和URL。每一个spider代表一个特定的任务
  • Item Pipeline: 负责处理item,典型的用途:清洗、验证、持久化
  • Downloader middlewares: 位于引擎和下载器之间的一个钩子,处理传送到下载器的requests和传送到引擎的response(若需要在Requests到达Downloader之前或者是responses到达spiders之前做一些预处理,可以使用该中间件来完成)
  • Spider middlewares: 位于引擎和抓取器之间的一个钩子,处理抓取器的输入和输出 (在spiders产生的Items到达Item Pipeline之前做一些预处理或response到达spider之前做一些处理)

一个小例子

创建项目

在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行下列命令:scrapy startproject book

创建项目

这些文件分别是:

scrapy.cfg: 项目的配置文件 book/: 该项目的python模块。之后您将在此加入代码。 book/items.py: 项目中的item文件. book/pipelines.py: 项目中的pipelines文件. book/settings.py: 项目的设置文件. book/spiders/: 放置spider代码的目录.

建立spider

首先要进入book目录,使用basic模板创建一个spider 建立spider, scrapy genspider douban https://book.douban.com/top250?start=0

spider

pycharm 调试scrapy

建立一个main.py文件,在book文件目录下,保证main.py和自动生成的scrapy.cfg在同一层,写入下面代码。此文件是为了方便再pycharm中调试scrapy,提高开发效率

from scrapy.cmdline import execute
import sys,os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy','crawl','douban'])

scrapy crawl douban即启动,名字为douban的spider

修改setting.py
  • 将setting.py中的遵循robot协议改为False,否则会过滤掉一些url
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
  • 模拟浏览器访问 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
提取想要的内容
xpath方式提取
  1. xpath简介
  • xpath使用路径表达式在xml和html中进行导航。
  • xpath包含标准函数库。
  • xpath是一个w3c的标准。
  1. xpath节点关系
  • 父节点
  • 子节点
  • 同胞节点
  • 先辈节点
  • 后代节点
  1. xpath语法

image.png

image.png

image.png

extract_first()是为了防止extract()[0]不存在的时候报错

name = node.xpath('td[2]/div[1]/a/text()').extract_first().strip()
summary = node.xpath('td[2]/p[2]/span/text()').extract_first()
  1. 在Shell中尝试Selector选择器 一直在pycharm调试xpath太复杂了,因此scrapy提供shell方便测试语法。首先您需要进入项目的根目录,执行下列命令来启动shell:scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 注意:当在终端运行Scrapy时,请一定记得给url地址加上引号,否则包含参数的url(例如 & 字符)会导致Scrapy运行失败。
css方式提取

image.png

image.png

image.png

定义Item

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。 (如果不了解ORM, 不用担心,您会发现这个步骤非常简单)。首先根据需要从book获取到的数据对item进行建模。 我们需要从book中获取名字,描述。 对此,在item中定义相应的字段。编辑 book目录中的 items.py 文件:

class BookItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    summary = scrapy.Field()
    pass

代码

GitHub地址https://github.com/zhangpu1211/scrapy

可能遇到的错误

No modle named ‘win32api’

解决方案:pip install -i https://pypi.douban.com/simple/ pypiwin32

为什么有时候自己写的xpath明明对的,却获取不到数据?

原因:F12产生的源码,不同于网页源代码,前者可能是js加载完的源代码。response.xpath()是根据网页源代码来提取信息的。

UserWarning: You do not have a working installation of the service_identity module: 'cannot import name 'opentype''.

解决方案:pip install service_identity --force --upgrade

csv文件输出空一行

在python中的Lib\site-packages\scrapy,编辑该路径下的exporters.py文件,并修改如下内容:

image.png

csv文件中文乱码

用sublime打开文件--以...编码保存--UTF-8 with BOM

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • xpath

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节...

    听城
  • spring 引入uploadify控件时的302与406

    302 302错误是由于spring拦截器造成的,需要将上传图片的controller不进行session验证即可 406 406是由于请求json头造成,解决...

    听城
  • mybatis实现一对一查询

    sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询使用内链接?还是外链接? 由于orders表中有一个外键(user_id),通过外键...

    听城
  • Sebastian Thrun 的一席演讲, 精辟的道出: 人工智能与人类间的关系

    2017.8.26, 深圳, Ken Fang 8.25 的中午, 深圳, 相当的令人期待、兴奋、开心; 因为, Sebastian 将在鹅厂有一场演讲。 Se...

    Ken Fang 方俊贤
  • 【程序源代码】HRM前后端分离系统

    https://gitee.com/itcode-itcode/saas-ihrm.git

    程序源代码
  • SQL Server 2008 FILESTREAM特性管理文件

    在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上...

    张善友
  • 人工智能正式成为微软的核心战略导向

    据外媒报道,微软(Microsoft)发布了年度报告,用大量篇幅的文献和数字阐述了该公司的核心愿景,这种愿景似乎正在发生变化。 正如美国全国广播公司财经频道(C...

    人工智能快报
  • 推荐 | 对话徐英瑾:也要给机器人做“思想工作”

    ---- ? 人类对于人工智能的想象由来已久,或许你会想到古代神话传说,神话故事里技艺高超的工匠可以制作人造人,并为其赋予智能或意识。而今天提到的人工智能不是...

    机器人网
  • 业界 | 聚焦科大讯飞刘庆峰两会建议:呼吁全社会关注人工智能,抢占全球人工智能产业制高点

    机器之心原创 作者:杜夏德 在 2016 年两会中,刘庆峰建议将人工智能作为国家战略性科技发展方向列入科技部的重要工作内容。今年人工智能写进了两会,应了他去年的...

    机器之心
  • AngularJs(3)

    <script type="text/javascript" src="angular.min.js"></script>

    py3study

扫码关注云+社区

领取腾讯云代金券