code_tin

Scrapy网页数据抓取教程-2.基础案例
Scrapy的抓取原理比较简单 就是下载完页面后通过解析器将其中的元素取出 然后通过自定义的方法进行保存(TXT,...
扫描右侧二维码阅读全文
18
2018/10

Scrapy网页数据抓取教程-2.基础案例

Scrapy的抓取原理比较简单
就是下载完页面后通过解析器将其中的元素取出
然后通过自定义的方法进行保存(TXT,MySQL,SQLLite或者其他任何存储方式)
我们先使用一个单文件的程序解释它的运行机制

读者能力假设

文章针对的读者群能力被假定:
对linux基础指令有一定掌握(cd,vi,ls等实用指令和程序)
对程序语言有一定掌握(变量,循环,函数等基础概念)
对python语言缺乏了解(语法层面不是很清楚)
对HTML和JS有基础概念(了解HTML语言的大致结构)
对数据库有基础概念(知道基本的概念和DML,DDL语句,比如select,insert和update)
对数据抓取只有大致概念(知道抓取数据的目的)

创建程序

先建立一个程序文件

vi myspider.py

然后输入程序内容

import scrapy

class BlogSpider(scrapy.Spider):
name = 'blogspider'
start_urls = ['https://blog.scrapinghub.com']

def parse(self, response):
for title in response.css('h2.entry-title'):
yield {'title': title.css('a ::text').extract_first()}

for next_page in response.css('div.prev-post > a'):
yield response.follow(next_page, self.parse)

 

执行程序

使用如下命令执行这个程序
scrapy为框架的执行命令,runspider为调用抓取脚本,最后一个为程序脚本的名称

scrapy runspider myspider.py

 

程序输出

如果前面环境配置正确的话
应该会看到程序输出如下的结果

2018-01-26 15:55:20 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: scrapybot)
2018-01-26 15:55:20 [scrapy.utils.log] INFO: Versions: lxml 4.1.1.0, libxml2 2.9.7, cssselect 1.0.3, parsel 1.3.1, w3lib 1.18.0, Twisted 17.9.0, Python 2.7.12 (default, Nov 20 2017, 18:23:56) - [GCC 5.4.0 20160609], pyOpenSSL 17.5.0 (OpenSSL 1.1.0g 2 Nov 2017), cryptography 2.1.4, Platform Linux-4.4.0-91-generic-x86_64-with-Ubuntu-16.04-xenial
...
{'title': u'Hello, world'}
...
2018-01-26 15:55:30 [scrapy.core.engine] INFO: Closing spider (finished)

因为程序的完整输出太多
所以我截取了一部分进行输出
输出的最上和最下是一些debug信息
而{}中的那部分内容,就是我们抓取到的数据

 

程序解读

下面我们来一行行的解读这个例子

import scrapy
#导入scrapy包,需要pip安装scrapy后才行

class BlogSpider(scrapy.Spider):
#新建立一个继承自scrapy.Spider的类
name = 'blogspider'
#命名这个爬虫的名称,今后在scrapy runspider的时候可以直接指定名称
start_urls = ['https://blog.scrapinghub.com'] 
#需要被抓取的页面列表,也可以是一个list,start_urls是框架默认定义的

def parse(self, response): 
#覆盖解析函数,parse会被框架在获取页面后默认调用,用来解析得到需要的页面元素
for title in response.css('h2.entry-title'): 
# response是解析后返回的页面,css方法是通过css样式表的方式进行元素定位
yield {'title': title.css('a ::text').extract_first()}
#将链接元素的text内容文本展开
for next_page in response.css('div.prev-post > a'):
#获取下一篇文章的连接地址
yield response.follow(next_page, self.parse)
#follow和request方法比较类似,就是访问传入的next_page,然后再用parse去解析一次,如此往复递归爬遍整个页面

上面的例子从blog.scrapinghub.com网站中获取页面,取出页面里样式为h2.entry-title的元素列表,在元素列表中循环获取超链接对应的文本信息,也就是标题栏
然后从页面的div.prev-post > a样式元素列表中一个个进行访问,调用parse函数本身进行解析

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment