爬取表情包

闲来无事,突然想到表情包好久没有更新了,正好这几天学了爬虫,利用爬虫来更新一波表情包,哈哈哈。

有一个网站,叫做“斗图啦”,网址是: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表情包,手把手教你爬取斗图啦表情包相关推荐

  1. 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!

    最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...

  2. 爬虫笔记——多线程爬取斗图网表情包(threading)

    爬虫笔记--多线程爬取斗图网表情包(threading) 网站观察 爬取框架 具体代码 斗图网网址:斗图网,这里以爬取最新套图为例. 网站观察 在网页翻页操作中可以看到网页是非动态加载的(page为页 ...

  3. 100行代码教你爬取斗图网(Python多线程队列)

    100行代码教你爬取斗图网(Python多线程队列) 前言 根据之前写的两篇文章,想必大家对多线程和队列有了一个初步的了解,今天这篇文章就来实战一下,用多线程 + 队列 爬取斗图网的全网图片. 你还在 ...

  4. python3爬虫——多线程爬取斗图网表情包

    本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...

  5. Python多线程爬取斗图啦表情包

    斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在了同一个文件夹下面,所以需要导入os模块 import asyncio import aiohttp ...

  6. Python项目实战:爬取斗图网表情包图片

    2019独角兽企业重金招聘Python工程师标准>>> 前言 相信大家在和别人聊天的时候都很喜欢斗图吧,斗着斗着斗忘记睡觉了,哈哈,感情得到了升华,下面来介绍一个利用Python在斗 ...

  7. python爬取斗图啦表情包并下载到本地

    迫于无聊,又刚好正在学习python,就来记录一篇关于python爬取图片链接下载本地的入门文章... 主要用到的模块: request 和 BeautifulSoup4 开发之前建议先看一下官方给出 ...

  8. 爬取斗图网表情包之后斗图会输?不存在的

    前言: 本文非常浅显易懂,可以说是零基础也可快速掌握.如有疑问,欢迎留言,笔者会第一时间回复. 一.分析表情包网址 1.进入斗图啦网址,点击**"最新表情"**,再点击第二.第三页 ...

  9. 熊猫人表情包python 代码_用Python爬取斗图网表情包

    一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...

最新文章

  1. java bufferedimage颜色_使用BufferedImage进行渐变色操作
  2. 在论坛中出现的各种疑难问题:性能优化
  3. 10款人气暴涨的PHP开源工具
  4. 用Perl发送邮件小例子
  5. 数据结构实验之求二叉树后序遍历和层次遍历
  6. 【mysql必知必会】第十二章 汇总数据
  7. 在MongoDB中存储分层数据
  8. securecrt哪个版本好用_电脑跑分测试软件哪个好?好用的电脑跑分软件推荐
  9. WAP自助建站 我编程之路的启蒙
  10. kolla-ansible-----常用命令
  11. 渗透测试之Nmap命令(二)
  12. centos7安装docker-ce新版
  13. ARM汇编开关终端cpsie/cpsid
  14. sm4 前后端 加密_7 个开源的 Spring Boot 前后端分离优质项目
  15. 打印word模板并预览打印
  16. 2021年法国经济发展研究报告
  17. 调侃《HeadFirst设计模式》之装饰者模式
  18. 使用PIE-Engine探寻地球灯光蕴藏的秘密
  19. Excel 文字转拼音
  20. linux crontab修改不生效,crontab 内容修改不生效

热门文章

  1. 写日记,是一个好习惯!
  2. 温湿度传感器(AM2312)
  3. 010.MODBUS与台达变频器通讯1
  4. IRS综述:智能反射面研究——面向6G无线通信网络
  5. allegro中xnet的等长设置
  6. php yii2 搜索功能,Yii2.0全站搜索功能上线
  7. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路
  8. npm instal 报错 npm ERR! cb()never called!
  9. 信息安全管理——对称加密
  10. 9、opencv 方盒、均值、高斯、中值、双边滤波 2022-08-22