分析目标

爬取的是斗鱼主播头像,示范使用的URL似乎是个移动接口(下文有提到),理由是网页主页属于动态页面,爬取难度陡升,当然爬取斗鱼主播头像这么恶趣味的事也不是我的兴趣......

目标URL如下,

http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=150

这是一个json形式文件(所谓json形式的文件实际就是把字典作为字符串保存起来),limit参数表示一次加载多少条目,offset表示偏移量,即加载的第一条项目相对于初始条目的位次数。

形式如下(这不是查看源码,而是数据本身就是这样,好像是个移动端接口),

形式和我之前保存的json相同,是字典的格式,key有error和data,data的value是list,中间的元素是房间的信息dict,这里列举了前两个房间。

我们需要爬取的是主播名字('nickname')和头像('vertical_src')。

item

import scrapy

class DouyuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
nickname = scrapy.Field()
imagelink = scrapy.Field()

  

spider

这里使用了json包的方法去解析str字符串为dict。

import scrapy
import json
from douyu.items import DouyuItem class DouyuspiderSpider(scrapy.Spider):
name = "DouyuSpider"
allowed_domains = ["douyucdn.cn"]
baseURL = 'http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset='
offset = 0
start_urls = [baseURL + str(offset)] def parse(self, response):
# .load和磁盘交互,.loads处理字符串
data_list = json.loads(response.body.decode('utf-8'))['data']
if not len(data_list):
return for data in data_list:
item = DouyuItem()
item['nickname'] = data['nickname']
item['imagelink'] = data['vertical_src']
yield item self.offset += 20
yield scrapy.Request(self.baseURL + str(self.offset), callback=self.parse)

  

pipelines

取消settings.py注释,

这里面我们继承了一个新的用于下载二进制文件的管线类,并改写了两个方法,用于,

  • 下载二进制文件
  • 根据下载结果(成功与否)将图片重命名为主播名

下载文件的方法会自动读取settings.py的字段,而且这个字段默认setting.py是没有的,所以需要在文件中手动添加,位置无所谓,

import os
import scrapy
from scrapy.pipelines.images import ImagesPipeline
from douyu.settings import IMAGES_STORE # 新的管线类,用于处理二进制文件
class DouyuPipeline(ImagesPipeline): # 二进制下载,电影视频实际都可以,会自动调用download模组的函数
def get_media_requests(self, item, info):
image_link = item['imagelink']
yield scrapy.Request(image_link) # 这个方法会在一次处理的最后调用(从返回item也可以推理出)
# result表示下载的结果状态
def item_completed(self, results, item, info):
# print(results)
# [(True, {'url': 'https://rpic.douyucdn.cn/acrpic/170827/3034164_v1319.jpg',
# 'checksum': '7383ee5f8dfadebf16a7f123bce4dc45', 'path': 'full/6faebfb1ae66d563476449c69258f2e0aa24000a.jpg'})]
image_path = [x['path'] for ok,x in results if ok]
os.rename(IMAGES_STORE + image_path[0], IMAGES_STORE + item['nickname'] + '.jpg')
return item

重命名函数os.rename比win下的重命名强多了,它可以对路径重命名达到修改文件位置的功效(内部原理贴近操作系统层面了,到底是os库的函数233)。

运行如下命令,

scrapy crawl DouyuSpider

结束即可查看图片,结果和下面类似,

『Scrapy』爬取斗鱼主播头像的更多相关文章

  1. 『Scrapy』爬取腾讯招聘网站

    分析爬取对象 初始网址, http://hr.tencent.com/position.php?@start=0&start=0#a (可选)由于含有多页数据,我们可以查看一下这些网址有什么相 ...

  2. 爬虫之selenium爬取斗鱼主播图片

    这是我GitHub上简单的selenium介绍与简单使用:https://github.com/bwyt/spider/tree/master/selenium%E5%9F%BA%E7%A1%80 & ...

  3. selenium,webdriver爬取斗鱼主播信息 实操

    from selenium import webdriver import time from bs4 import BeautifulSoup class douyuSelenium(): #初始化 ...

  4. python实战之原生爬虫(爬取熊猫主播排行榜)

    """ this is a module,多行注释 """ import re from urllib import request # B ...

  5. 『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息

    每个漏洞条目包含: 乌云ID,漏洞标题,漏洞所属厂商,白帽子,漏洞类型,厂商或平台给的Rank值 主要是做数据分析使用:可以分析某厂商的各类型漏洞的统计:或者对白帽子的能力进行分析..... 数据更新 ...

  6. Scrapy:虎牙爬取,图片存储与数据分析

    第一次爬取虎牙主播数据,有点小激动 1.共批量爬取的101个主播的,包括 头像 主播名字 房间号 房间链接 2.数据规整部分,需要将json数据加载到pandas的Dataframe,只显示的前15个 ...

  7. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...

  8. 用Python爬取斗鱼网站的一个小案例

    思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...

  9. 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息

    简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ...

随机推荐

  1. excel选择元角分下拉菜单选择框自动变更数字

    excel选择元角分下拉菜单选择框自动变更数字 (M2列),数据-->数据有效性-->在“允许”栏中选择序列-->在“来源”栏中输入:分,角,元单位倍数公式(M4列):=IF(M2= ...

  2. 【DIV+CSS】代码作业练习DIV+CSS太极阴阳图

    1. DIV + CSS 练习:太极阴阳图.  基本思路:由三个div块元素组成:  #taiji太极阴阳图底面  #yin太极阴阳图阴面小圆  #yang太极阴阳图阳面小圆  (太极阴阳图:上为阳下 ...

  3. MySQL笔记(三)由txt文件导入数据

    改编自学校实验,涉及一些字符集相关的问题. 索引 建库 导入数据 最终脚本 下载数据 点击这里 建库 create.sql DROP DATABASE IF EXISTS orderdb; CREAT ...

  4. (五)使用GitHub的前期准备

    创建账户 创建账号成功后将得到一个个人的公开页面URL:https://github.com/xkfx. 设置头像 设置SSH Key SSH 为 Secure Shell 的缩写. from bai ...

  5. zabbix监控之自定义item

    zabbix安装完成后,当需要使用自定义脚本构建自定义item必须注意以下几点: 1.首先使用zabbix_get手动在zabbix-server服务端获取监控的默认的item值,如下: [root@ ...

  6. canvas压缩图片

    1.canvas.toDataUrl压缩图片 canvas的toDataUrl方法可以将内容导出为base64编码格式的图片,采用base64编码将比源文件大1/3,但是该方法可以指定导出图片质量,所 ...

  7. 洛谷月赛 Hello World(升级版) - 动态规划

    题目背景 T1答案要mod1000000007(10^9+7),请重新提交,非常抱歉! 一天,智障的pipapi正在看某辣鸡讲义学程序设计. 题目描述 在讲义的某一面,他看见了一篇文章.这篇文章由英文 ...

  8. 通过例子来理解python闭包。

    闭包:就是内部函数对enclosing作用域的变量进行引用.(可先参考python函数作用域LEGB) 通过一个例子体会 def func_150(val): passline = 90 if val ...

  9. Python3基础 函数 无参数无返回值 调用会输出hello world的函数

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. HDU 1285 确定比赛名次(拓扑排序)题解

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...