Python爬虫(二)——多线程下载壁纸图片(星月设计网)
文章目录
- Python爬虫——多线程下载图片(星月设计网)
- 目的:
- redis存储结构:
- 使用到的python库:
- 1. 导入相关库
- 2. 连接redis
- 3.爬虫主要类及函数
- 4.爬取结果:
Python爬虫——多线程下载图片(星月设计网)
星月设计网
星月设计网的反爬虫机制较薄弱,我甚至没有加上headers就直接爬取成功了,懒人学习多线程非常合适。当然在之后我会尝试更复杂和有意义的数据爬取及数据分析。爬取星月设计网的图片一是可以做一些兴趣分析、而是可以做自己的壁纸用(见文末结果中的魔童降世敖丙的图片就很帅,爬取一堆图片方便选择)
目的:
学习多线程爬虫与练习图片缓存,熟悉redis应用(此处redis应用非常浅显)
redis存储结构:
使用hash存储,name为图片的名称,内部键值对包括了图片名称、图片url地址、图片作者、图片评分等信息
使用到的python库:
os、requests、redis、lxml、urllib.request、threading、queue等
1. 导入相关库
import os
import requests
import redis
from lxml import etree
import urllib.request
import time
import threading
from queue import Queue
2. 连接redis
pool = redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.ping()) #验证连接
3.爬虫主要类及函数
代码中没有很多的注释,因为就是一个很简单的多线程。为了更清楚爬虫的结构做以下解释:
- Producer——生产者,通过页面地址不断遍历得到每个图片的地址
- page_queue 用来保存页面的url
- img_queue 用来保存图片的url及图片名称
- Consumer——消费者,通过图片的地址进行下载图片
class Producer(threading.Thread):def __init__(self,page_queue,img_queue,*args,**kwargs):super(Producer, self).__init__(*args, **kwargs)self.page_queue = page_queueself.img_queue = img_queueself.wallpaper_urls=[]def run(self):while True:if self.page_queue.empty():breakpage_url = self.page_queue.get()page_text = self.deal_url(page_url)self.parse_indexPage(page_text)for wallpaper_url in self.wallpaper_urls:wallpaper_text = self.deal_url(wallpaper_url)self.parse_detailPage(wallpaper_text)def deal_url(self,url):response = requests.get(url)response.encoding= response.apparent_encodingreturn response.textdef parse_indexPage(self,text):html = etree.HTML(text)wallpaper_urls = html.xpath("//li[@class='wzbt']/a/@href")for url in wallpaper_urls:url = "https://www.vipxingyue.com/"+urlself.wallpaper_urls.append(url)def parse_detailPage(self,text):try:html = etree.HTML(text)wallpaper_name = "".join(html.xpath("//div[@class='h hm']/h1/text()")).strip()wallpaper_author = "".join(html.xpath("//p[@class='xg1']/a/text()")).strip()wallpaper_viewnum = "".join(html.xpath("//p[@class='xg1']/em/text()")).strip()wallpaper_imgUrl = html.xpath("//td[@id='article_content']//a/@href")r.hset(wallpaper_name,'name',wallpaper_name)r.hset(wallpaper_name,'author',wallpaper_author)r.hset(wallpaper_name,'viewnum',wallpaper_viewnum)for i,img_url in enumerate(wallpaper_imgUrl):img_name = wallpaper_name+'_'+str(i+1)+'.jpg'img_url = "https://www.vipxingyue.com/"+img_urlr.hset(wallpaper_name,img_name,img_url)self.img_queue.put((img_name,img_url))except:print("没有该页信息") class Consumer(threading.Thread):def __init__(self,page_queue,img_queue,*args,**kwargs):super(Consumer,self).__init__(*args,**kwargs)self.page_queue = page_queueself.img_queue = img_queuedef run(self):while True:if self.img_queue.empty() and self.page_queue.empty():breakimg_name,img_url = self.img_queue.get()self.save_img(img_name,img_url)def save_img(self,img_name,img_url):root= './2_figure/'path = root+img_nametry:if not os.path.exists(root):os.mkdir(root)if not os.path.exists(path):read_figure = requests.get(img_url)with open(path,'wb')as f:f.write(read_figure.content)f.close()print(path+" save ok!")else:print('文件已保存')except:print("文件爬取失败") def main():base_url = 'https://www.vipxingyue.com/wallpaper/index.php?page={}'page_queue = Queue(20)img_queue = Queue(200)page_num = 10for x in range(1,page_num+1):url = base_url.format(x)page_queue.put(url)for x in range(5):t = Producer(page_queue,img_queue)t.start() for x in range(5):t = Consumer(page_queue,img_queue)t.start()if __name__ == '__main__':main()
4.爬取结果:
爬取了20个页面共计600+张照片(请注意自己爬取的速度,不要给网站服务器造成过多的负担!!!)
上图为爬取的结果之一。
Python爬虫(二)——多线程下载壁纸图片(星月设计网)相关推荐
- python爬虫实现批量下载百度图片
今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...
- 用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)
参考文章:https://www.cnblogs.com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只 ...
- python爬虫实战——自动下载百度图片(文末附源码)
用Python制作一个下载图片神器 前言 这个想法是怎么来的? 很简单,就是不想一张一张的下载图片,嫌太慢. 在很久很久以前,我比较喜欢收集各种动漫的壁纸,作为一个漫迷,自然是能收集多少就收集多少.小 ...
- python唯美壁纸_用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)
参考文章:https://www..com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只是很久之前学过 ...
- python爬虫爬取网页壁纸图片(《底特律:变人》)
参考文章:https://www.cnblogs.com/franklv/p/6829387.html 爬虫爬取网址:http://www.gamersky.com/news/201804/10396 ...
- 图片爬虫,手把手教你Python多线程下载获取图片
图片站lemanoosh数据为异步加载的形式,往下拉会展示更多数据,也就是下一页数据,通过谷歌浏览器可以很清晰的看到数据接口地址,以及数据展现形式,与其他网站返回json数据的不同之处是,该网站返回的 ...
- Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片
Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...
- Python爬虫之scrapy下载文件和图片
Python爬虫之scrapy下载文件和图片 一:pipeline 二:使用scrapy下载图片 2.1 创建scrapy项目 1.2 创建爬虫 1.3 配置文件设置 1.4 编写启动文件 1.5 爬 ...
- mac用python爬虫下载图片_使用Python爬虫实现自动下载图片
python爬虫支持模块多.代码简洁.开发效率高 ,是我们进行网络爬虫可以选取的好工具.对于一个个的爬取下载,势必会消耗我们大量的时间,使用Python爬虫就可以解决这个问题,即可以实现自动下载.本文 ...
最新文章
- 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019
- 彻底解决SQL SERVER 2008无法远程连接的问题
- 写出最感兴趣的软件测试工作,你还不会写测试用例?!注意这五点,写出模板级的测试用例!...
- 关于同步加载与异步加载的区别
- Java 9 新功能之 HTTP2 和 REPL
- linux 链接文件 通配符,linux globbing文件通配符
- OpenShift 4 Hands-on Lab (1) - 多种方法部署运行应用
- 虚拟机中修改Fedora10/9屏幕的分辨率
- 外汇EA量化真的可以赚钱吗?还是新型骗局?
- 进击zheng项目zheng-umps-server
- 假面骑士鸿蒙系统,《假面骑士》街机游戏,这样组合太棒了!
- (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理
- CAD中插入外部参照字体会变繁体_CAD外部参照无法绑定怎么办?
- 8.ansible高级进阶-role详解
- 贝叶斯网络的python实现:Monty Hall问题的求解
- SPSS并行配置不正确
- 复现 MMDetection
- Oracle Linux 6.9安装和Oracle 11.2.0.4.0安装及psu补丁升级
- 攻防世界web高手进阶php_rce,[CTF]攻防世界web高手进阶区Writeup(更行ing)
- Egret引擎外部字体的解决方案
热门文章
- 360html收藏夹,360浏览器的收藏夹如何保存?360浏览器收藏夹备份方法
- 具有生物启发训练方法的物理深度学习:物理硬件的无梯度方法
- 计算机类(计算机科学与技术)大学生职业生涯规划书
- L2正则化(L2 Regularization)
- geodesic distance
- Python语法API调试,taobao1688pinduoduo商品详情测试接口
- http://www.makepic.com/print.php,在线制作印章
- 网站性能优化— WebP 全方位介绍
- 大型直播平台应用架构浅谈
- 怎么把钉钉的文件导入电脑_钉钉文件怎么保存到电脑