『Scrapy』爬取斗鱼主播头像
分析目标
爬取的是斗鱼主播头像,示范使用的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』爬取斗鱼主播头像的更多相关文章
- 『Scrapy』爬取腾讯招聘网站
分析爬取对象 初始网址, http://hr.tencent.com/position.php?@start=0&start=0#a (可选)由于含有多页数据,我们可以查看一下这些网址有什么相 ...
- 爬虫之selenium爬取斗鱼主播图片
这是我GitHub上简单的selenium介绍与简单使用:https://github.com/bwyt/spider/tree/master/selenium%E5%9F%BA%E7%A1%80 & ...
- selenium,webdriver爬取斗鱼主播信息 实操
from selenium import webdriver import time from bs4 import BeautifulSoup class douyuSelenium(): #初始化 ...
- python实战之原生爬虫(爬取熊猫主播排行榜)
""" this is a module,多行注释 """ import re from urllib import request # B ...
- 『Python』 爬取 WooYun 论坛所有漏洞条目的相关信息
每个漏洞条目包含: 乌云ID,漏洞标题,漏洞所属厂商,白帽子,漏洞类型,厂商或平台给的Rank值 主要是做数据分析使用:可以分析某厂商的各类型漏洞的统计:或者对白帽子的能力进行分析..... 数据更新 ...
- Scrapy:虎牙爬取,图片存储与数据分析
第一次爬取虎牙主播数据,有点小激动 1.共批量爬取的101个主播的,包括 头像 主播名字 房间号 房间链接 2.数据规整部分,需要将json数据加载到pandas的Dataframe,只显示的前15个 ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...
- 用Python爬取斗鱼网站的一个小案例
思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...
- 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息
简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ...
随机推荐
- 最新版Intellij IDEA插件JRebel 7.0.7官方免费激活
本文转自:http://blog.csdn.net/u012283609/article/details/70213307 开场语 有时候真实比小说更加荒诞,因为虚构是在一定逻辑下进行的,而现实往往毫 ...
- Python Web学习笔记之TCP/IP协议原理与介绍
HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...
- Antlr4 SQL Query 解析实例
grammar MysqlQuery; @header{package com.antlr.mysql.query;} AS : A S; SELECT : S E L E C T; FROM : F ...
- TF-调整矩阵维度 tf.reshape 介绍
函数原型为 def reshape(tensor, shape, name=None) 第1个参数为被调整维度的张量. 第2个参数为要调整为的形状. 返回一个shape形状的新tensor 注意sha ...
- 使用libcurl开源库和Duilib做的下载文件并显示进度条的小工具
转载:http://blog.csdn.net/mfcing/article/details/43603525 转载:http://blog.csdn.net/infoworld/article/de ...
- 【ssh免登录】设置集群环境ssh免登录步骤
1.每台机器都需要执行,生成自己的密钥 # ssh-keygen -t rsa 过程中遇到选项,全部enter #cd ~/.ssh # cat id_rsa.pub > authorized_ ...
- css布局一屏幕的自适应高度
css ;;list-style: none;} .top{height: 100px;background-color:orange;} .max{;background-color:skyblue ...
- 操作构造字符串化宏#define STRINGIZE(x) #x
c++test工程单元测试中报错 “STRINGIZE” 未定义错误 解决方案:在头文件定义宏STRINGIZE #符号把一个符号直接转换为字符串,例如:#define STRINGIZE(x) #x ...
- html 绘制矩形轨迹,选中区域
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- lombok 中的@Data注解
今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...