文章目录

  • 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——生产者,通过页面地址不断遍历得到每个图片的地址

    1. page_queue 用来保存页面的url
    2. 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爬虫(二)——多线程下载壁纸图片(星月设计网)相关推荐

  1. python爬虫实现批量下载百度图片

    今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...

  2. 用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www.cnblogs.com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只 ...

  3. python爬虫实战——自动下载百度图片(文末附源码)

    用Python制作一个下载图片神器 前言 这个想法是怎么来的? 很简单,就是不想一张一张的下载图片,嫌太慢. 在很久很久以前,我比较喜欢收集各种动漫的壁纸,作为一个漫迷,自然是能收集多少就收集多少.小 ...

  4. python唯美壁纸_用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www..com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只是很久之前学过 ...

  5. python爬虫爬取网页壁纸图片(《底特律:变人》)

    参考文章:https://www.cnblogs.com/franklv/p/6829387.html 爬虫爬取网址:http://www.gamersky.com/news/201804/10396 ...

  6. 图片爬虫,手把手教你Python多线程下载获取图片

    图片站lemanoosh数据为异步加载的形式,往下拉会展示更多数据,也就是下一页数据,通过谷歌浏览器可以很清晰的看到数据接口地址,以及数据展现形式,与其他网站返回json数据的不同之处是,该网站返回的 ...

  7. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  8. Python爬虫之scrapy下载文件和图片

    Python爬虫之scrapy下载文件和图片 一:pipeline 二:使用scrapy下载图片 2.1 创建scrapy项目 1.2 创建爬虫 1.3 配置文件设置 1.4 编写启动文件 1.5 爬 ...

  9. mac用python爬虫下载图片_使用Python爬虫实现自动下载图片

    python爬虫支持模块多.代码简洁.开发效率高 ,是我们进行网络爬虫可以选取的好工具.对于一个个的爬取下载,势必会消耗我们大量的时间,使用Python爬虫就可以解决这个问题,即可以实现自动下载.本文 ...

最新文章

  1. 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019
  2. 彻底解决SQL SERVER 2008无法远程连接的问题
  3. 写出最感兴趣的软件测试工作,你还不会写测试用例?!注意这五点,写出模板级的测试用例!...
  4. 关于同步加载与异步加载的区别
  5. Java 9 新功能之 HTTP2 和 REPL
  6. linux 链接文件 通配符,linux globbing文件通配符
  7. OpenShift 4 Hands-on Lab (1) - 多种方法部署运行应用
  8. 虚拟机中修改Fedora10/9屏幕的分辨率
  9. 外汇EA量化真的可以赚钱吗?还是新型骗局?
  10. 进击zheng项目zheng-umps-server
  11. 假面骑士鸿蒙系统,《假面骑士》街机游戏,这样组合太棒了!
  12. (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理
  13. CAD中插入外部参照字体会变繁体_CAD外部参照无法绑定怎么办?
  14. 8.ansible高级进阶-role详解
  15. 贝叶斯网络的python实现:Monty Hall问题的求解
  16. SPSS并行配置不正确
  17. 复现 MMDetection
  18. Oracle Linux 6.9安装和Oracle 11.2.0.4.0安装及psu补丁升级
  19. 攻防世界web高手进阶php_rce,[CTF]攻防世界web高手进阶区Writeup(更行ing)
  20. Egret引擎外部字体的解决方案

热门文章

  1. 360html收藏夹,360浏览器的收藏夹如何保存?360浏览器收藏夹备份方法
  2. 具有生物启发训练方法的物理深度学习:物理硬件的无梯度方法
  3. 计算机类(计算机科学与技术)大学生职业生涯规划书
  4. L2正则化(L2 Regularization)
  5. geodesic distance
  6. Python语法API调试,taobao1688pinduoduo商品详情测试接口
  7. http://www.makepic.com/print.php,在线制作印章
  8. 网站性能优化— WebP 全方位介绍
  9. 大型直播平台应用架构浅谈
  10. 怎么把钉钉的文件导入电脑_钉钉文件怎么保存到电脑