文章目录

  • 搭建scrapy项目
    • 安装scrapy
    • 构造scrapy框架
    • 构建一个爬虫
  • 分析网页
    • 观察网页源代码
    • 学习网页结构(了解可以跳过)
    • 学习网页表格(了解可以跳过)
    • 学习XPath语法(了解可以跳过)
  • 实现爬虫
    • 修改指定的网页名
    • 编写parse函数
  • 运行爬虫
    • 运行命令
    • 配置settings
      • 设置ROBOT君子协议
      • 设置请求头

一开始笔者都是使用requests+bs4实现爬虫,直到后来我发现了有一个功能强大使用简单的爬虫框架——scrapy,本文是一个入门级教程,会记录下从零开始使用scrapy实现最简单爬虫的全过程:


搭建scrapy项目

安装scrapy

第一步,安装scrapy,在命令行中输入:

pip install scrapy

当然,如果你使用的是pycharm,就可以在Project:PythonProject Interperter → 点击右侧的+号搜索scrapy进行安装。


构造scrapy框架

第二步,构建scrapy框架,在命令行中输入:

scrapy startproject xxx(项目名)

此处笔者输入了scrapy startproject hello_scrapy,便会在项目目录下生成一个hello_scrapy文件夹:

hello_scrapy文件夹内有如下结构:

第二个hello_scrapy目录内有,这里有各种各样的配置文件,作为入门教程,我们只需要了解settings.py的部分配置:
spiders目录内有:


构建一个爬虫

接下来,我们在项目中构建第一个爬虫,在命令行中输入:

cd 项目名
scrapy genspider xxx(爬虫名) xxxxxx(域名)

cd命令用于切换文件夹到项目文件夹内,scrapy genspider用于创建一个爬虫,第一个参数是爬虫名,此处爬虫名切忌与项目名重复! 第二个参数是域名,如想要爬取的网站如果是百度百科对Python的记录:https://baike.baidu.com/item/Python/407313,它的域名便是掐头去尾剩下的部分:baidu.com

此处笔者想实现一个爬取英为财情https://cn.investing.com/网上期货数据的爬虫,便输入了以下命令:

cd hello_scrapy
scrapy genspider futures_spider investing.com

输入后便会在hello_scrapy/hello_scrapy/spiders中生成一个新文件futures_spider.py(期货爬虫):
futures_spider.py中的内容:

# -*- coding: utf-8 -*-
import scrapyclass FuturesSpiderSpider(scrapy.Spider):name = 'futures_spider'allowed_domains = ['investing.com']start_urls = ['http://investing.com/']def parse(self, response):pass

此处的pass便是我们需要输入的地方。


分析网页

观察网页源代码

我们先来浏览一下英为财情网的期货数据,我们要爬取的网页是:https://cn.investing.com/commodities/real-time-futures

通过观察网页的结构和源代码,我们发现网页的期货数据被存储在表格结构中,接下来,我们就要对这个表格中的数据进行爬取:


学习网页结构(了解可以跳过)

作为入门教程,我们先来简单了解一下网页结构:每个网页都分为headbodyhead主要用于网页的初始化,例如设置编码格式,设置标题,引入脚本,引入风格样式等;而body用于显示网页的内容,如下便是一个基础的网页结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>网页标题</title>
</head>
<body>
Hello html!
</body>
</html>

效果如下,非常简单:


学习网页表格(了解可以跳过)

接下来,我们来了解一下网页的表格结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>表格示例</title>
</head>
<body>
<table><tr><th>ID</th><th>Name</th></tr><tr><td>NO.001</td><td>Alex</td></tr><tr><td>NO.002</td><td>Amy</td></tr><tr><td>NO.003</td><td>John</td></tr><tr><td>NO.004</td><td>Helen</td></tr>
</table>
</body>
</html>

这是一个简单的表格:

  • table是表格本体
  • table中包含tr,即table row,表示表格的一行
  • tr中有thtdthtable head,意为表头
  • tdtable data,意为表中数据,即表身

我们这里的表格创建了IDName两个表头,表中导入了四排数据,效果如下:


学习XPath语法(了解可以跳过)

在简单了解html之后,我们来了解一下xpath语法:

  • //表示选择所有,如//tr表示选择所有tr
  • ./表示当前目录的下一个目录
  • text()表示该目录的中内容

即使不熟悉xpath,我们也有另一个办法,通过在想获取的元素上右键检查(笔者使用chrome作为浏览器),在元素上右键 → CopyCopy Xpath,我们便可以获得该元素的Xpath

此示例获取的xpath/html/body/table/tbody/tr[4]/td[2],当然我们也可以通过Copy full Xpath获取完整的Xpath

我们来观察一下此例中得到的Xpath

John位于:

  • <html>
  • <body>
  • <table>
  • <tbody>tbodythead对应,表示表身,即使源代码中不写,浏览器编译后也会自动生成)
  • tr[4](即第4个tr,此处的tr的位置用数组形式表示索引)
  • td[2](即第2个td,同样使用索引标记位置)

在了解这些前置知识之后,我们就可以开始实现parse函数,我们再次观察要爬取的网页:

可以发现,表格中tr行的第2个数据里的超链接标签a对应商品名,第4个对应最新价,第8个对应涨跌幅。

因此,

  • 商品名内容的XPath路径为//tr/td[2]/a/text()(意为所有tr标签下的第二个tda标签的内容)
  • 最新价为//tr/td[4]/text()
  • 涨跌幅为//tr/td[8]/text()

实现爬虫

修改指定的网页名

start_urls指定的网页修改成所要爬取的网页名:

start_urls = ['https://cn.investing.com/commodities/real-time-futures']

编写parse函数

实现parse函数(parse意为语法分析,顾名思义,用于解读网页结构获取内容)

def parse(self, response):#创建一个selector列表,其中包含所有tr行selectors = response.xpath('//tr')#遍历selector列表for selector in selectors:#获取商品名,get函数用于得到一个元素futures_type = selector.xpath('./td[2]/a/text()').get()#获取最新价latest_price = selector.xpath('./td[4]/text()').get()#获取涨跌幅change_rate = selector.xpath('./td[8]/text()').get()#如果数据存在(防止遍历到没有数据的tr行)if futures_type and latest_price and change_rate:#打印数据print(futures_type, latest_price, change_rate)

运行爬虫

运行命令

接下来我们来运行一下试试,运行爬虫需要在命令行中项目目录下输入如下指令:

scrapy crawl xxx(爬虫名)

笔者此处输入:

scrapy crawl futures_spider

效果如下,此处为节省篇幅只显示错误提示:

2020-04-27 23:46:28 [scrapy.core.engine] DEBUG: Crawled (403) <GET https://cn.investing.com/commodities/real-time-futures> (referer: None)
2020-04-27 23:46:28 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 https://cn.investing.com/commodities/real-time-futures
>: HTTP status code is not handled or not allowed

可以看到,网页报了403错误,意为服务器拒绝处理,这是为什么呢?


配置settings

设置ROBOT君子协议

因为我们没有在settings.py中设置一些必要的选项,settings中有一条ROBOTSTXT_OBEY,意为是否遵守君子协议,若为True,你可以爬取的格式、范围、次数等就要受到网站要求的限制,所以为了正常爬取,我们需要修改为False(你懂的):

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

设置请求头

然而这样设置之后还是不行,因为我们需要指定User-Agent请求头,才能把爬虫伪装成一个浏览器,User-Agent同样可以在settings中设置:

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'

设置之后,我们便可以得到数据啦,再次在命令行中输入:

scrapy crawl futures_spider

返回结果:

2020-04-27 23:56:01 [scrapy.utils.log] INFO: Scrapy 2.0.1 started (bot: hello_scrapy)
2020-04-27 23:56:01 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 20.
3.0, Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1f  31 Mar 2020),
cryptography 2.9, Platform Windows-10-10.0.18362-SP0
2020-04-27 23:56:01 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-04-27 23:56:01 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'hello_scrapy','NEWSPIDER_MODULE': 'hello_scrapy.spiders','SPIDER_MODULES': ['hello_scrapy.spiders'],'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) ''AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 ''Safari/536.5'}
2020-04-27 23:56:01 [scrapy.extensions.telnet] INFO: Telnet Password: 8f3e69fc82bdb3cc
2020-04-27 23:56:01 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats','scrapy.extensions.telnet.TelnetConsole','scrapy.extensions.logstats.LogStats']
2020-04-27 23:56:02 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware','scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware','scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware','scrapy.downloadermiddlewares.useragent.UserAgentMiddleware','scrapy.downloadermiddlewares.retry.RetryMiddleware','scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware','scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware','scrapy.downloadermiddlewares.redirect.RedirectMiddleware','scrapy.downloadermiddlewares.cookies.CookiesMiddleware','scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware','scrapy.downloadermiddlewares.stats.DownloaderStats']
2020-04-27 23:56:02 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware','scrapy.spidermiddlewares.offsite.OffsiteMiddleware','scrapy.spidermiddlewares.referer.RefererMiddleware','scrapy.spidermiddlewares.urllength.UrlLengthMiddleware','scrapy.spidermiddlewares.depth.DepthMiddleware']
2020-04-27 23:56:02 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-04-27 23:56:02 [scrapy.core.engine] INFO: Spider opened
2020-04-27 23:56:02 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-04-27 23:56:02 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-04-27 23:56:03 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://cn.investing.com/commodities/real-time-futures> (referer: None)
黄金 1,723.45 -0.70%
XAU/USD 1,710.37 -1.07%
白银 15.273 +0.07%
铜 2.349 +0.53%
铂 777.75 +0.51%
钯 1,897.30 -4.43%
WTI原油 12.23 -27.80%
伦敦布伦特原油 22.82 -8.02%
天然气 1.837 -3.06%
燃料油 0.7071 -3.51%
RBOB汽油 0.6939 -0.89%
伦敦汽油 192.75 -6.20%
铝 1,507.75 -0.54%
锌 1,910.50 +1.16%
铅 1,638.75 +0.74%
镍 12,240.00 -0.16%
铜 5,199.25 +0.20%
锡 15,450.00 +3.14%
美国小麦 525.88 -0.78%
稻谷 14.655 -0.07%
玉米 314.62 -2.29%
美国大豆 840.62 +0.07%
美国大豆油 24.94 -2.20%
美国豆粕 292.50 -0.03%
美国二号棉花 54.96 -1.20%
美国可可 2,330.50 +0.32%
美国C型咖啡 106.20 -0.52%
伦敦咖啡 1,143.00 0.00%
美国11号糖 9.52 -2.96%
橙汁 112.08 +3.20%
活牛 83.675 +1.27%
瘦肉猪 56.17 +6.94%
饲牛 118.69 +1.21%
木材 312.30 -3.10%
燕麦 281.10 -1.26%
2020-04-27 23:56:03 [scrapy.core.engine] INFO: Closing spider (finished)
2020-04-27 23:56:03 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 328,'downloader/request_count': 1,'downloader/request_method_count/GET': 1,'downloader/response_bytes': 55344,'downloader/response_count': 1,'downloader/response_status_count/200': 1,'elapsed_time_seconds': 1.551372,'finish_reason': 'finished','finish_time': datetime.datetime(2020, 4, 27, 15, 56, 3, 887893),'log_count/DEBUG': 1,'log_count/INFO': 10,'response_received_count': 1,'scheduler/dequeued': 1,'scheduler/dequeued/memory': 1,'scheduler/enqueued': 1,'scheduler/enqueued/memory': 1,'start_time': datetime.datetime(2020, 4, 27, 15, 56, 2, 336521)}
2020-04-27 23:56:03 [scrapy.core.engine] INFO: Spider closed (finished)

这样我们就得到结果啦,接下来可以写一个writer存储数据,笔者此处便不再赘述。

【入门级教程】python使用scrapy库实现爬虫相关推荐

  1. python 定时执行 爬虫 模块_浅析python实现scrapy定时执行爬虫

    项目需要程序能够放在超算中心定时运行,于是针对scrapy写了一个定时爬虫的程序main.py ,直接放在scrapy的存储代码的目录中就能设定时间定时多次执行. 最简单的方法:直接使用Timer类 ...

  2. python网络爬虫系列教程——python中requests库应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python中requests库的基础应用,网页数据挖掘的常用库之一.也就是说最主要的功能是从网页抓取数据. 使用前需要先联网安装reques ...

  3. python菜鸟教程python机器学习工具库

    正是由于Python简单易用以及高开发效率,吸引了大量的开发者为其创建更多新的机器学习工具库:而又因为大量的机器学习工具库的出现,使得Python在机器学习领域变得如此流行. 下面我们就来探索一下机器 ...

  4. python网络爬虫系列教程——python中pyquery库应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python网络爬虫lxml库的应用全解. 在线安装方法:cmd中输入"pip install pyquery" 离线安装 ...

  5. python网络爬虫系列教程——python中lxml库应用全解(xpath表达式)

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python网络爬虫lxml库的应用全解. 在线安装方法:cmd中输入"pip install lxml" 离线安装,下载 ...

  6. python:scrapy 一个网站爬虫库

    Scrapy是一个用于抓取网站和提取结构化数据的应用框架,可用于广泛的有用应用,如数据挖掘.信息处理或历史档案.也可以使用api提取数据,或者作为一个通用的web爬虫. 安装 C:\Users\lif ...

  7. python深度学习库系列教程——python调用opencv库教程

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python教程全解 OpenCV安装 pip inst ...

  8. python基础系列教程——python所有包库的下载

    下载地址:https://pypi.python.org/pypi?%3Aaction=browse 支持搜索 Index by date: multidict pymatgen moderngl j ...

  9. pycharm中scrapy库的安装以及创建

    python中scrapy库应用实例 首先,你已经安装好了pycharm 第一步,安装库,我们要知道pycharm有非常好用的库的安装,我们点击file->settings----->进入 ...

最新文章

  1. 【转发】什么时候该用委托,为什么要用委托,委托有什么好处
  2. 【转】MFC消息映射详解(整理转载)
  3. opencv画框返回坐标 python_python opencv鼠标事件实现画框圈定目标获取坐标信息
  4. 【CyberSecurityLearning 2】IP地址与DOS命令
  5. 当你自定义view用的约束之后,放到其他空间算取frame的时候发现frame里的x,y都是0...
  6. LINQ学习(四):From子句
  7. 不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹
  8. 再看中国互联网web2.0百强名单
  9. http请求POST和GET调用接口以及反射动态调用Webservices类
  10. 备战2022年5月软考高项 —— 信息系统项目管理师
  11. mc9.1编程教程入门_教程1-什么是编程?
  12. 阿里云MaxComputer SQL学习之内置函数
  13. 达梦数据库出现故障无法启动解决方法-通过归档日志修复数据库
  14. 随笔记:实现HTML页面局部滚动及自定义滚动条样式
  15. 【Vue】通过computed为筛选列表数组进行排序(图文+完整代码示例)
  16. 免费申请 HTTPS 证书,开启全站 HTTPS
  17. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)
  18. PCIe LTSSM 之 Detect 状态
  19. zt围棋是世界上最大的伪科学
  20. 【简易】微信小程序日期Date的加减

热门文章

  1. 黑莓开发学习(入门教程)
  2. 计算机美术基础学情分析,二年级美术学情分析
  3. 博山计算机培训,博山服务态度好的财务软件使用培训招生简章
  4. Android View 通过平移、旋转、缩放后,顶点映射
  5. 紫砂壶开壶全过程纪实 - 罗泽南(顺竹)
  6. SAP GUI中创建的快捷方式直接保存密码方法介绍
  7. 浮点数的存储,规格化
  8. 如何删除旧网卡驱动,释放旧网卡的配置
  9. Kibana:构建自定义 kibana 可视化,推动更深入的洞察
  10. Java Hessian反序列化漏洞