26个数据分析案例——第五站:基于Scrapy的架构的数据采集
案例环境
数据说明
- title:课程标题
- image_url:标题图片地址。
- properties:课程性质。
- stage:课程阶段。
- enrollment:课程报名人数。
资料包
链接:https://pan.baidu.com/s/1-DUUUAOfpC4Gs5DAaHcgUg 提取码:5u6s
实验步骤
第一步:页面分析
在爬取某个网页中的数据之前,首先要学会如何去分析其页面的结构,我们想要的数据都在那个标签中,只有充分了解页面的整体结构才能够有效且快速的爬取数据。,本次实战案例将爬取慕课往的页面数据。 1、首先打开浏览器输入网址http://www.imooc.com/course/list 进入慕课网 2、在该页面任意空白区域,单击右键显示工具菜单,效果为: 3、单击“查看网页源代码(V)”查看网页源代码中的数据结构,并分析结构 从图中可以清晰的看出,
- 每门课程的详细信息都包含在一个class名为“item free”的a标签中,
- 课程标题包含在class为title ellipsis2的p标签中;
- 课程正处于的阶段和报名的总人数包含在class为one的p标签中;
- 课程性质被包含在class为“1”的span标签中;
- 标题图片地址为class为“img”div标签的style属性值中。
至此我们已经对页面中的数据结构有了一定的了解,下面我们就开始进行数据的采集。
第二步 编写代码采集数据
1、打开命令窗口,创建一个名为“InternetWorm”的Scrapy爬虫项目,命令如下所示。
scrapy startproject InternetWorm
结果为: 2、项目创建完成后进入InternetWorm项目的根目录,代码如下所示。
cd InternetWorm
scrapy genspider MySpider www.imooc.com/course/list
结果如图。 打开根目录中 的MySpider.py,并编写以下代码。
import scrapy
class MyspiderSpider(scrapy.Spider):
name = 'MySpider'
allowed_domains = ['imooc.com']
start_urls = ['http://www.imooc.com/course/list/']
def parse(self, response):
pass
3、打开items.py ,在改文件中创建名为“CourseItem”的类,并定义好要爬取数据的相关字段。
import scrapy
class ScrapyprojectItem(scrapy.Item):
pass
class CourseItem(scrapy.Item):
title=scrapy.Field();
image_url=scrapy.Field();
properties=scrapy.Field();
stage=scrapy.Field();
enrollment=scrapy.Field();
4、打开MySpider.py文件,修改allowed_domains(域名列表设置为imooc.com),之后导入Selector并解析Response对象并使用XPath方式选取所有列表内容,代码如下所示。
import scrapy
from scrapy.selector import Selector
class MyspiderSpider(scrapy.Spider):
name = 'MySpider'
allowed_domains = ['imooc.com']
start_urls = ['http://www.imooc.com/course/list/']
def parse(self, response):
sel = Selector(response)
sels = sel.xpath('//a[@class="item free "]')
print(sels)
pass
5、运行爬虫
scrapy crawl MySpider
6、程序能够正常运行说明上述步骤配置正确,打开MySpider.py文件,将items.py中的自定义类导入并实例化一个新的信息保存容器,最后通过遍历的方式获取内容并赋值给这个容器,
import scrapy
from scrapy.selector import Selector
from InternetWorm.items import CourseItem
class MyspiderSpider(scrapy.Spider):
name = 'MySpider'
allowed_domains = ['imooc.com']
start_urls = ['http://www.imooc.com/course/list/']
def parse(self, response):
sel = Selector(response)
sels = sel.xpath('//a[@class="item free "]')
item = CourseItem()
for box in sels:
item['title'] = box.xpath('.//p[@class="title ellipsis2"]/text()').extract()[0].strip()
print("课程标题:",item['title'])
item['image_url'] = box.xpath('.//div[@class="img"]/@style').extract()[0].strip()[23:-2]
print("标题图片地址:","http:"+item['image_url'])
item['properties'] = box.xpath('.//span[@class="l"]/text()').extract()[0].strip()
print("课程性质:",item['properties'])
item['stage'] = box.xpath('.//p[@class="one"]/text()').extract()[0].strip().split(" · ")[0]
print("课程阶段:",item['stage'])
item['enrollment'] = box.xpath('.//p[@class="one"]/text()').extract()[0].strip().split(" · ")[1][:-3]
print("报名人数:",item['enrollment'])
pass
重新运行项目。
scrapy crawl MySpider
7、如果您得到了和我一样的结果,恭喜你已经成功的爬取到了网页中的数据。但是只能够读取到一页的数据,下面我们将继续修改代码,实现自动翻页,这里使用xpath判断当页码标签中是否存在包含下一页的标签,如果存在就获取该标签内容,之后组合成下一页的网页地址并通过scrapy.Request()方法返回parse()函数继续爬取该页面的课程信息,直到页码标签中不存在下一页标签后停止,修改MySpider.py文件
import scrapy
from scrapy.selector import Selector
from InternetWorm.items import CourseItem
pageIndex = 0
class MyspiderSpider(scrapy.Spider):
name = 'MySpider'
allowed_domains = ['imooc.com']
start_urls = ['http://www.imooc.com/course/list']
def parse(self, response):
sel = Selector(response)
sels = sel.xpath('//a[@class="item free "]')
item = CourseItem()
index = 0
global pageIndex
pageIndex += 1
print('第' + str(pageIndex) + '页 ')
print('----------------------------------------------')
for box in sels:
item['title'] = box.xpath('.//p[@class="title ellipsis2"]/text()').extract()[0].strip()
item['image_url'] = "http:"+box.xpath('.//div[@class="img"]/@style').extract()[0].strip()[23:-2]
item['properties'] = box.xpath('.//span[@class="l"]/text()').extract()[0].strip()
item['stage'] = box.xpath('.//p[@class="one"]/text()').extract()[0].strip().split(" · ")[0]
item['enrollment'] = box.xpath('.//p[@class="one"]/text()').extract()[0].strip().split(" · ")[1][:-3]
index += 1
yield item
next = u'下一页'
url = response.xpath("//a[contains(text(),'" + next + "')]/@href").extract()
if url:
page = 'http://www.imooc.com' + url[0]
yield scrapy.Request(page, callback=self.parse)
pass
重新执行项目。
scrapy crawl MySpider
最后还能够将爬取到的数据保存到文件中。
scrapy crawl MySpider -o data.csv
后续案例持续更新
01 基于Python的HBase冠字号查询系统 02基于Hive的民航客户价值分析 03 基于python的药店销售数据分析 04基于Flume与Kafka的web服务器日志数据采集 05 基于Scrapy的架构的数据采集 06 Linux操作系统实时日志采集并处理 07 医疗行业案例-中医病症辩证关联规则分析 08教育行业案例-高校学生生活数据分析 10 娱乐行业案例-广告收益回归预测模型 11网络行业案例-网站访问行为分析 12零售行业案例-店铺热门商品实时统计 13 营业额数据可视化 14金融行业案例-基于上市公司股票信息及其衍生变量的金融数据分析 15银行信用卡风险数据可视化 16 滴滴出行城市运营分析 17 幸福指数可视化 18 员工主动离职预警模型 19 歌手推荐模型 20 2020新冠肺炎疫情数据分析 21 淘宝购物狂欢节数据分析 22 共享单车数据分析 23人脸检测系统 24服装分拣系统 25口罩佩戴识别系统 26 imdb电影数据分析 20 2020新冠肺炎疫情数据分析 21 淘宝购物狂欢节数据分析 22 共享单车数据分析 23人脸检测系统 24服装分拣系统 25口罩佩戴识别系统 26 imdb电影数据分析
|