用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爬素材网站相关推荐

  1. python爬取收费素材_Python爬虫练习:爬取素材网站数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在工作中的电子文案.ppt,生活中的新闻.广告,都离不开大量的素材,而素材 ...

  2. Python爬取素材网站的音频文件

    这篇文章主要介绍了基于Python爬取素材网站音频文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下,另外我建立了一个Python学习圈子群:115 ...

  3. Python爬取网站用户手机号_设计师的福利,python爬取素材网站

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本环境配置 python 3.6 pycharm requests parsel 相关模块 ...

  4. Php使用selenium爬虫,selenium,python爬虫_使用selenium爬取网站时输出结果不正确,selenium,python爬虫 - phpStudy...

    使用selenium爬取网站时输出结果不正确 网站链接:http://www.ncbi.nlm.nih.gov/pubmed?term=(%222013%22%5BDate%20-%20Publica ...

  5. ai字体素材网站_4个网站,涵盖几乎所有素材,字体、设计、图片各种资源管够...

    最近发现了几个优质的网址导航,收录了各类素材网站,提供各类字体素材.高清图片.在线设计网站,还有很多办公小工具. 01字体酷站 https://www.fonturl.com/ 全球最大的字体网址导航 ...

  6. 如何使用robots禁止各大搜索引擎爬虫爬取网站

    如何使用robots禁止各大搜索引擎爬虫爬取网站 一.总结 一句话总结:假如此网站禁止爬虫抓取,那么,只要在网站的根目录下,创建一个robots.txt文件 User-agent: * Disallo ...

  7. python如何爬取网站所有目录_[python] 爬取网站所有的URL

    运行python脚本,最终程序目录下会是这样: result.txt中保存所有的URL 文件夹sh.neusoft.com中保存爬虫得到的所有网页 main.py的源代码如下 # -*- coding ...

  8. 类似纪念碑谷的unity2d素材包_有哪些免费的音效素材网站?

    刀剑相交?马蹄踏地?人物行走?电闪雷鸣? 这些在影视剧中常见的音效效果,如何才能快速找到?接下来就给各位同学推荐一系列免费.不侵权.实测好用的音效素材网站!国内国外的都有,每一个质量都非常高,相信总有 ...

  9. mixamo网站_超全面的素材网站推荐

    做设计最怕遇到的糟糕情况 莫过于常用的灵感站子打不开了 就像这位悲催的老哥 它们似乎总是这样任性 维护前没有一丝丝预兆 空留设计师们无情哀嚎 #404# 譬如最近挂了还打不开的觅元素 又譬如挂了后修复 ...

最新文章

  1. ubuntu php7 memcache,linux ubuntu下安装php memcache扩展
  2. android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...
  3. python怎么安装requests库-Python3.6安装及引入Requests库的实现方法
  4. S3C6410禁用和启用触摸屏
  5. 计算机教师队伍掌握的素质,多措并举,努力打造高素质计算机教师x队伍.doc
  6. 使用spark ml pipeline进行机器学习
  7. Redis源代码分析之sds, 动态数组
  8. java run 方法_java线程中的run()方法能有几个啊?
  9. 快速入门Treap(代码实现)
  10. 卡诺模型案例分析_卡诺模型及使用
  11. python opencv 将白色底变成透明底
  12. 勾号、叉号、圈号的收集
  13. ruoyi-vue集成积木报表
  14. WebGIS理论知识(七)—走进互联网地图
  15. ad17编辑界面怎么检查未连线_EZCast投屏软件提示未发现装置,请检查网路连线状态怎么办?...
  16. pcb排版技巧_借鉴大师的排版技巧
  17. 一个手机里登录2个微信号(微信双开)
  18. 为快捷方式文件(lnk文件)右键菜单添加“打开所在文件夹”
  19. 3分钟了解入门「机器学习」该学习什么?(上)
  20. 在线教育app开发,教学管理系统的开发方案设计

热门文章

  1. win10无法更新计算机启动配置,win10系统提示“无法更新启动配置”故障的恢复办法...
  2. 速卖通、Lazada、美客多、亚马逊新品流量如何利用测评快速提升?
  3. 视频号小店缴纳保证金
  4. linux环境CPU使用率过高问题定位
  5. 重装系统后服务器无法正常开机,界面报System will find bootable device automatically,No bootable device
  6. Word基础(二十七)表格之重复标题
  7. greg名字寓意_主题演讲-Greg Gilley与Adobe
  8. torch的cumsum
  9. 一点建议,一点正能量
  10. 七牛云账号注销与解绑