手把手教学php表情包,手把手教你爬取斗图啦表情包
爬取表情包
闲来无事,突然想到表情包好久没有更新了,正好这几天学了爬虫,利用爬虫来更新一波表情包,哈哈哈。
有一个网站,叫做“斗图啦”,网址是:https://www.doutula.com/。这里面包含了许许多多的有意思的斗图图片,还蛮好玩的。这里我分析了两种方式获取斗图啦的表情包:
1.利用 Scrapy 框架爬取斗图啦最新套图
2.通过斗图啦网站提供的 API 接口,获取 json 获取图片(异步IO)
说明:本爬虫纯粹是个人娱乐,如果他人使用该爬虫对网站服务器造成不良影响与本人无关。
Scrapy框架爬取套图
页面分析
页面分析是为了找到这些图片或者 URL 之间的规律,通过这些规律我们在写爬虫去获取相应的内容,如图:
页面分析
通过上图,我们可以发现 “ http://www.doutula.com/article/list/?page=2 ” 中 page 参数表示当前是第几页。套图详情是在 “ http://www.doutula.com/article/detail/xxxxx ” 这个地址下面的,其中 xxxxx 是一个类似套图id的一串数字(因为后面我们是用正则来匹配这串数字,所以具体是多少不重要啦~)。我们要找的表情包就在详情页面下,接着分析详情页面,如图:
套图详情分析图
由此我们可以发现套图里面的表情包是放在详情页面下有 “class=pic-content” 的 div 标签下的一组 class 属性为 artile_des 的 div 标签里面的,只是它嵌套的比较深是在每个 div 标签下的table>tbody>tr>td>a下。
编写Spider
框架结构:
爬虫目录结构
爬虫--bqbspider.py:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spider import CrawlSpider, Rule
from scrapy.linkextractor import LinkExtractor
from bqb.items import BqbItem
class BqbspiderSpider(CrawlSpider):
name = 'bqbspider'
allowed_domains = ['www.doutula.com']
start_urls = ['http://www.doutula.com/article/list/']
rules = (
Rule(LinkExtractor(allow=(r'http://www.doutula.com/article/list/\?page=\d+'))),
Rule(LinkExtractor(allow=(r'http://www.doutula.com/article/detail/\d+')), callback='get_image_parse'),
)
def get_image_parse(self, response):
item = BqbItem()
item['title'] = response.xpath('//div[@class="pic-title"]/h1/a/text()').extract_first()
item['data'] = {}
pic_list = response.xpath('//div[@class="pic-content"]//div[@class="artile_des"]')
for pic in pic_list:
pic_url = pic.xpath('./table/tbody/tr[1]/td/a/img/@src').extract_first()
pic_name = pic.xpath('./table/tbody/tr[1]/td/a/img/@alt').extract_first()
item['data'][pic_name] = pic_url
return item
注意:Rule 中定义的规则,会从当前 url 请求的 response 中去进行匹配,如果当前规则匹配成功,并且指定了 callback 回调函数,那么就会请求该 url 并执行回调函数, 如果没有指定回调函数,则表示爬虫继续跟进匹配到的 url。
items.py 文件中定义爬虫返回的字段:
import scrapy
class BqbItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
data = scrapy.Field()
pipelines.py文件中定义了对爬虫爬取到的内容进行的处理操作:
import os
import requests
class BqbPipeline(object):
def process_item(self, item, spider):
dir_name = dict(item)['title']
if not os.path.exists("E:\\images\\" + dir_name):
os.mkdir("E:\\images\\" + dir_name)
data = dict(item)['data']
for pic in data:
pic_url = data[pic]
print(pic_url.rfind('/'))
name = pic_url[pic_url.rfind('/') + 1:]
filename = "E:\\images\\" + dir_name + "\\" + name
try:
with open(filename, 'wb') as f:
f.write(requests.get(data[pic]).content)
except IOError as e:
print(e)
print(name, '下载完成!')
这里爬虫的主要代码就没有了,剩下的就是根据自己的需要配置settings.py文件了,建议设置cookie,和缓存,并配置适当的请求数和延迟。
部分爬取效果截图:
爬取结果图一
REST接口获取图片
REST接口就简单多了,这是网址提供的请求接口,这就只需要我们构造一个url请求,获取到服务器返回的 json 即可。在返回的 json 中就有表情包的下载链接,直接下载就可以了。啥都不说了,直接上代码:
import re
import requests
import asyncio
# 批量生成 url 请求参数列表
def create_json(key, mine=0):
params = []
for i in range(1, 51):
data = {
'type': 'photo',
'more': 1,
'keyword': key,
'page': i,
'mime': mine,
}
params.append(data)
return params
# 下载并保持图片
@asyncio.coroutine
def save_pic(url):
if re.search(r'^/[a-z].*', url):
url = 'https://www.doutula.com' + url
if url.startswith('//'):
url = 'https:' + url
if re.search(r'jpg|gif|png', url):
b_img = requests.get(url, headers=headers).content
filename = './images/' + url[url.rfind('/') + 1:]
try:
with open(filename, 'wb') as f:
f.write(b_img)
except IOError as e:
print(e)
finally:
pass
# 获取图片url列表
@asyncio.coroutine
def download_img(param):
url = 'https://www.doutula.com/api/search'
img_list = requests.get(url, params=param, headers=headers).json()['data']['list']
while len(img_list) > 0:
img = img_list.pop()
yield from save_pic(img['image_url'])
print('%s下载完成' % img['out_id'])
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' \
' (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'
}
def main():
loop = asyncio.get_event_loop()
params = create_json('蘑菇头')
tasks = [download_img(param) for param in params]
loop.run_until_complete(asyncio.wait(tasks))
print('Complete!')
if __name__ == '__main__':
main()
获取结果图:
REST效果图
手把手教学php表情包,手把手教你爬取斗图啦表情包相关推荐
- 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!
最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...
- 爬虫笔记——多线程爬取斗图网表情包(threading)
爬虫笔记--多线程爬取斗图网表情包(threading) 网站观察 爬取框架 具体代码 斗图网网址:斗图网,这里以爬取最新套图为例. 网站观察 在网页翻页操作中可以看到网页是非动态加载的(page为页 ...
- 100行代码教你爬取斗图网(Python多线程队列)
100行代码教你爬取斗图网(Python多线程队列) 前言 根据之前写的两篇文章,想必大家对多线程和队列有了一个初步的了解,今天这篇文章就来实战一下,用多线程 + 队列 爬取斗图网的全网图片. 你还在 ...
- python3爬虫——多线程爬取斗图网表情包
本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...
- Python多线程爬取斗图啦表情包
斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在了同一个文件夹下面,所以需要导入os模块 import asyncio import aiohttp ...
- Python项目实战:爬取斗图网表情包图片
2019独角兽企业重金招聘Python工程师标准>>> 前言 相信大家在和别人聊天的时候都很喜欢斗图吧,斗着斗着斗忘记睡觉了,哈哈,感情得到了升华,下面来介绍一个利用Python在斗 ...
- python爬取斗图啦表情包并下载到本地
迫于无聊,又刚好正在学习python,就来记录一篇关于python爬取图片链接下载本地的入门文章... 主要用到的模块: request 和 BeautifulSoup4 开发之前建议先看一下官方给出 ...
- 爬取斗图网表情包之后斗图会输?不存在的
前言: 本文非常浅显易懂,可以说是零基础也可快速掌握.如有疑问,欢迎留言,笔者会第一时间回复. 一.分析表情包网址 1.进入斗图啦网址,点击**"最新表情"**,再点击第二.第三页 ...
- 熊猫人表情包python 代码_用Python爬取斗图网表情包
一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...
最新文章
- java bufferedimage颜色_使用BufferedImage进行渐变色操作
- 在论坛中出现的各种疑难问题:性能优化
- 10款人气暴涨的PHP开源工具
- 用Perl发送邮件小例子
- 数据结构实验之求二叉树后序遍历和层次遍历
- 【mysql必知必会】第十二章 汇总数据
- 在MongoDB中存储分层数据
- securecrt哪个版本好用_电脑跑分测试软件哪个好?好用的电脑跑分软件推荐
- WAP自助建站 我编程之路的启蒙
- kolla-ansible-----常用命令
- 渗透测试之Nmap命令(二)
- centos7安装docker-ce新版
- ARM汇编开关终端cpsie/cpsid
- sm4 前后端 加密_7 个开源的 Spring Boot 前后端分离优质项目
- 打印word模板并预览打印
- 2021年法国经济发展研究报告
- 调侃《HeadFirst设计模式》之装饰者模式
- 使用PIE-Engine探寻地球灯光蕴藏的秘密
- Excel 文字转拼音
- linux crontab修改不生效,crontab 内容修改不生效