用tornado爬素材网站
用tornado爬素材网站
(第一篇技术笔记)
工作需要建立一个飞机图片和视频库,一方面,可以从开源数据集中抽取需要的数据,如Pascal VOC,CIFAR10,COCO和ILSVRC等都包含飞机类别图片,ILSVRC的VID任务包含大量视频片段,我总共从这些数据集中获得了1000(VOC)+3000(COCO)+1400(ILSVRC)=5400张图片以及171段视频;另一方面,可以通过爬虫工具从网上获取更多资源,搜狐优酷这类网站的资源比较杂乱,不符合我的需求,获取效率不高,最终锁定了国内外各种视频和图库的素材资源网站。
开发针对单个资源网站的爬虫相对简单,也叫垂直爬虫,一般为了提高效率会采用多线程,或者直接利用工具包,如scrapy等。tornado是一个轻量级web后端框架,像django和flask一样,tornado包含异步网络库,利用协程(单线程),可以简单高效地实现高并发。
1、爬取百度图片的简单示例
示例代码借鉴自tornado官网文档(这里)5s获取300张。改一改可以实现各种用途,爬图片、视频、小说、新闻、评论、商品等。
import os
import re
import time
from tornado import httpclient, gen, ioloop, queues
from datetime import timedelta
from urllib.parse import quotepath = "./imgs/"
if not os.path.exists(path):os.makedirs(path)
e_names = set(os.listdir(path))
keyword = "战斗机"
re_imgs = re.compile('"thumbURL":"(.*?)",')@gen.coroutine
def main():''' 生产消费者模型,通过队列完成数据通信 '''start = time.time()concurrency = 500 # 设置并发大小和队列大小q = queues.Queue(maxsize=concurrency)@gen.coroutinedef worker():# 消费每个下载链接while True:src = yield q.get()try:filename = src.split("/")[-1]if filename not in e_names:response = yield httpclient.AsyncHTTPClient().fetch(src)with open(path+filename, "wb") as file:file.write(response.body)file.flush()e_names.add(filename)except Exception as e:print("PRO_CON:"+str(e))q.task_done()# 启动所有消费者worker,此时队列为空,所有worker阻塞在`src = yield q.get()`语句for i in range(concurrency):worker()# 启动生产者,获取10页图片地址,如何获取url链接,在浏览器按F12# 打开"网络"(Networks),在刷新图片时抓包就可以看到for page_index in range(1,11):url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592\&is=&fp=result&queryWord="+quote(keyword)+"&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=\&st=-1&z=&ic=0&word="+quote(keyword)+"&s=&se=&tab=&width=&height=&face=0&istype=2\&qc=&nc=1&fr=&pn=%d"%(30*page_index)+"&rn=30&gsm=1e&1533995815287="response = yield httpclient.AsyncHTTPClient().fetch(url)srcs = re_imgs.findall(response.body.decode("utf8",errors="ignore"))print("page: %03d, #pics: %d"%(page_index,len(srcs)))for src in srcs:yield q.put(src)yield q.join(timeout=timedelta(seconds=300))print("Concurrent task done in %d seconds"%(time.time()-start))if __name__ == '__main__':io_loop = ioloop.IOLoop.current()io_loop.run_sync(main)
顺便说下,在数据解析性能方面,能用正则表达式和xpath,就不要用beautifulSoup和json(某些时候),解析过程一般如下:
import requests
from lxml import etree
import jsonhtml = requests.get(some_url)
# re的使用
re_obj = re.compile('<img src="(.*?)" />')
srcs = re_obj.findall(html.text)# xpath使用
selector=etree.HTML(html.text)
srcs = selector.xpath("//li/a/img/@src") #返回图片地址列表列表# json使用
data = json.loads(html.text)
srcs = data["imgs"]
2、关注请求头和响应头
在向服务器端发送请求时,除了目标连接url之外,通常还需要合理设置请求头,cookie字段通常被服务器用于识别用户,保持通信状态,User-Agent表明你使用的浏览器及版本,响应头则是服务器返回给用户的数据包的一部分,会给出服务器的部分信息,如服务器软件类型(apache/tomcat),返回数据的类型(xhr/mp4/mov),服务器时间,以及set-cookie等,其中set-cookie字段告知浏览器在下次发送请求时需要设置cookie的内容,比如给你分配一个用户id,下次请求服务器时带上这个就知道你是谁了,另外响应头中的location字段会将请求重定位到新的url上,这也是很多资源网站保护数据内容的一种手段。
这是tornado关于header和request相关API的介绍,有个网站在下载视频时必须保持较长时间的连接,在header中可以将request_timeout设长一点,如果要执行发送数据的post请求,需要将data进行urlencode后,放入request的body字段中。
from urllib.parse import urlencode
from tornado import httpclient,httputil,ioloopasync def f():data = urlencode({"wd":"战斗机"})headers = httputil.HTTPHeaders()headers.add("cookie","x123456789")request = httpclient.HTTPRequest("http://www.baidu.com/s?"+data, method="GET", headers=headers, body=None, connect_timeout=1*60, request_timeout=10*60)http_client = httpclient.AsyncHTTPClient()try:response = await http_client.fetch(request)except Exception as e:print("Error: %s" % e)else:# 查看响应头,content-type字段表明body中的文件类型print(resopnse.headers)# 查看传回的数据,body是字节码,可以是文本文件,也可以使音乐视频等内容print(response.body.decode(errors="ignore"))io_loop = ioloop.IOLoop.current()
io_loop.run_sync(f)
实践源码可以参考:https://github.com/ziweipolaris/simple-crawler
用tornado爬素材网站相关推荐
- python爬取收费素材_Python爬虫练习:爬取素材网站数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在工作中的电子文案.ppt,生活中的新闻.广告,都离不开大量的素材,而素材 ...
- Python爬取素材网站的音频文件
这篇文章主要介绍了基于Python爬取素材网站音频文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下,另外我建立了一个Python学习圈子群:115 ...
- Python爬取网站用户手机号_设计师的福利,python爬取素材网站
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本环境配置 python 3.6 pycharm requests parsel 相关模块 ...
- Php使用selenium爬虫,selenium,python爬虫_使用selenium爬取网站时输出结果不正确,selenium,python爬虫 - phpStudy...
使用selenium爬取网站时输出结果不正确 网站链接:http://www.ncbi.nlm.nih.gov/pubmed?term=(%222013%22%5BDate%20-%20Publica ...
- ai字体素材网站_4个网站,涵盖几乎所有素材,字体、设计、图片各种资源管够...
最近发现了几个优质的网址导航,收录了各类素材网站,提供各类字体素材.高清图片.在线设计网站,还有很多办公小工具. 01字体酷站 https://www.fonturl.com/ 全球最大的字体网址导航 ...
- 如何使用robots禁止各大搜索引擎爬虫爬取网站
如何使用robots禁止各大搜索引擎爬虫爬取网站 一.总结 一句话总结:假如此网站禁止爬虫抓取,那么,只要在网站的根目录下,创建一个robots.txt文件 User-agent: * Disallo ...
- python如何爬取网站所有目录_[python] 爬取网站所有的URL
运行python脚本,最终程序目录下会是这样: result.txt中保存所有的URL 文件夹sh.neusoft.com中保存爬虫得到的所有网页 main.py的源代码如下 # -*- coding ...
- 类似纪念碑谷的unity2d素材包_有哪些免费的音效素材网站?
刀剑相交?马蹄踏地?人物行走?电闪雷鸣? 这些在影视剧中常见的音效效果,如何才能快速找到?接下来就给各位同学推荐一系列免费.不侵权.实测好用的音效素材网站!国内国外的都有,每一个质量都非常高,相信总有 ...
- mixamo网站_超全面的素材网站推荐
做设计最怕遇到的糟糕情况 莫过于常用的灵感站子打不开了 就像这位悲催的老哥 它们似乎总是这样任性 维护前没有一丝丝预兆 空留设计师们无情哀嚎 #404# 譬如最近挂了还打不开的觅元素 又譬如挂了后修复 ...
最新文章
- ubuntu php7 memcache,linux ubuntu下安装php memcache扩展
- android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...
- python怎么安装requests库-Python3.6安装及引入Requests库的实现方法
- S3C6410禁用和启用触摸屏
- 计算机教师队伍掌握的素质,多措并举,努力打造高素质计算机教师x队伍.doc
- 使用spark ml pipeline进行机器学习
- Redis源代码分析之sds, 动态数组
- java run 方法_java线程中的run()方法能有几个啊?
- 快速入门Treap(代码实现)
- 卡诺模型案例分析_卡诺模型及使用
- python opencv 将白色底变成透明底
- 勾号、叉号、圈号的收集
- ruoyi-vue集成积木报表
- WebGIS理论知识(七)—走进互联网地图
- ad17编辑界面怎么检查未连线_EZCast投屏软件提示未发现装置,请检查网路连线状态怎么办?...
- pcb排版技巧_借鉴大师的排版技巧
- 一个手机里登录2个微信号(微信双开)
- 为快捷方式文件(lnk文件)右键菜单添加“打开所在文件夹”
- 3分钟了解入门「机器学习」该学习什么?(上)
- 在线教育app开发,教学管理系统的开发方案设计
热门文章
- win10无法更新计算机启动配置,win10系统提示“无法更新启动配置”故障的恢复办法...
- 速卖通、Lazada、美客多、亚马逊新品流量如何利用测评快速提升?
- 视频号小店缴纳保证金
- linux环境CPU使用率过高问题定位
- 重装系统后服务器无法正常开机,界面报System will find bootable device automatically,No bootable device
- Word基础(二十七)表格之重复标题
- greg名字寓意_主题演讲-Greg Gilley与Adobe
- torch的cumsum
- 一点建议,一点正能量
- 七牛云账号注销与解绑