文章目录

  • 一、前言
  • 二、需求
  • 三、技术路线
  • 四、线程池爬取2万张装修效果图
  • 五、其他

一、前言


2020-04-08日爬虫练习
每日一个爬虫小练习,学习爬虫的记得关注哦!

学习编程就像学习骑自行车一样,对新手来说最重要的是持之以恒的练习。
在《汲取地下水》这一章节中看见的一句话:“别担心自己的才华或能力不足。持之以恒地练习,才华便会有所增长”,现在想来,真是如此。

二、需求


具体参考我昨日爬虫:【每日爬虫】:给自己打造一个温馨的家,面朝大海,春暖花开

三、技术路线

import requests
import random, os, sys
from bs4 import BeautifulSoup  # 数据解析之BeautifulSoup4库
import re,time  # 正则表达式
from concurrent.futures import ThreadPoolExecutor   # 线程池

关于 线程池 可以参考我免费专栏:python多线程与多进程编程
关于 requests 和 BeautifulSoup模块可以关注我免费专栏:爬虫学习笔记

四、线程池爬取2万张装修效果图

'''线程池爬土巴兔装修效果图,按分类爬取version:02author:金鞍少年Blog:https://jasn67.blog.csdn.net/date:2020-04-08可以按照这个思路将所有涉及到网络请求,添加到异步线程池中,这样速度更快,但是对目标网站不友好,高频请求可能会导致被封IP'''
import requests
import random, os, sys
from bs4 import BeautifulSoup
import re,time
from concurrent.futures import ThreadPoolExecutorclass House_renderings():def __init__(self):self.pool = ThreadPoolExecutor(10)  # 开10个线程的线程池self.is_running = True   # 当is_running为True时,说明程序还在运行# 户型self.house_lis = '''------- 请选择户型 ---------1:一居室2:两居室3:三居室4:四居室及以上5:复式6:别墅豪宅7:其他8:退出'''self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Referer': 'https://xiaoguotu.to8to.com/'}# 代理ipself.all_proxies = [{'http': '183.166.20.179:9999'}, {'http': '125.108.124.168:9000'},{'http': '182.92.113.148:8118'}, {'http': '163.204.243.51:9999'},{'http': '175.42.158.45:9999'}]  # 需要自行去找一些免费的代理,参考我其他博客案例self.path = './res/'  # 本地存储目录# 获取HTMldef get_html(self, url):try:result = requests.get(url=url, headers=self.headers, proxies=random.choice(self.all_proxies))result.raise_for_status()  # 主动抛出一个异常html = BeautifulSoup(result.text, 'lxml')return htmlexcept:print('链接失败!')# 获取分页urldef get_page_urls(self, url, html):try:Pages = list(html.find('div', class_="pages").find_all('a'))[-2].stringfor page in range(1, int(Pages) + 1):page_url = url+'p{}'.format(page)yield page_urlexcept AttributeError:yield url# 获取详情页面urldef get_detail_urls(self, page_html):try:page_html = page_html.result()a_tag = page_html.find('div', class_="xmp_container").find_all('a', class_="item_img")for a in a_tag:detail_urls = 'https:' + a['href']self.pool.submit(self.get_html, detail_urls).add_done_callback(self.Save_detail_page)except Exception as e:print(e)# 获取详情页内容,并保存到本地def Save_detail_page(self, detail_html):detail_html = detail_html.result()try:house_style = detail_html.find('ul', class_="tag_list xg_tag").find('a').string  # 装修风格house_type = detail_html.find('ul', class_="tag_list xg_tag").find_all('a')[1].string  # 户型atlas_name = detail_html.find('strong', id="fine_n").get_text()  # 图集名atlas_name = re.sub(r"[\/\\\:\*\?\"\<\>\|]", "_", atlas_name)  # 转义 Windows文件名中的非法字符方法file_path = self.path + house_type + '/' + house_style + '/' + atlas_name + '/'  # 拼接文件存储路径# 递归创建文件夹if not os.path.exists(file_path):os.makedirs(file_path)imgs = detail_html.find('div', class_="display-none").find_all('img')for index, img in enumerate(imgs):jpg = requests.get(img['src'], headers=self.headers, proxies=random.choice(self.all_proxies))with open(file_path + '%s.jpg' % (index + 1), 'wb')as f:f.write(jpg.content)print('{}-{}.jpg 保存成功!'.format(atlas_name, index))self.is_running = False  # 告诉主进程任务结束except Exception as e:if hasattr(e, 'reason'):print(f'抓取失败,失败原因:{e.reason}')# 选择户型def choice_house(self):while True:print(self.house_lis)choice = input("请选择输入序号选择户型 :").strip()if choice == "1":return 'https://xiaoguotu.to8to.com/list-h2s7i0'elif choice == "2":return 'https://xiaoguotu.to8to.com/list-h2s2i0'elif choice == "3":return 'https://xiaoguotu.to8to.com/list-h2s3i0'elif choice == "4":return 'https://xiaoguotu.to8to.com/list-h2s4i0'elif choice == "5":return 'https://xiaoguotu.to8to.com/list-h2s5i0'elif choice == "6":return 'https://xiaoguotu.to8to.com/list-h2s6i0'elif choice == "7":return 'https://xiaoguotu.to8to.com/list-h2s8i0'elif choice == "8":print('退出成功!')sys.exit()else:print('输入错误,重新输入!')# 逻辑功能def func(self):house_classify_url = self.choice_house()html = self.get_html(house_classify_url)for url in self.get_page_urls(house_classify_url, html):self.pool.submit(self.get_html, url).add_done_callback(self.get_detail_urls)#  防止主线程结束,如果主进程结束,线程池也就关闭了while True:time.sleep(0.000001)  # 避免cpu空转,浪费资源if not self.is_running:breakself.pool.shutdown()  # 关闭线程池,不再接收新任务,但池内已有任务会继续执行,所有任务执行完后该线程池中的所有线程都会死亡。if __name__ == '__main__':# 开启线程池h = House_renderings()h.func()




五、其他

1、可以按照这个思路将所有涉及到网络请求,添加到异步线程池中,这样速度更快,但是对目标网站不友好,高频请求可能会导致被封IP,我只将部分网络请求添加到线程池中,有需要的小伙伴可以自己修改。
2、有没有想学python的小伙伴一起组队战拖延症啊,我感觉我的拖延症犯了,总是喜欢把任务拖到下午或者晚上,然后草草的解决。
3、不是广告,也不卖课程,就是单纯的想组队战拖,有愿意一起学习的小伙伴私信或者评论留言,一起加个好友相关监督学习python吧。

【每日爬虫】:利用线程池爬取2万张装修效果图相关推荐

  1. Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化

    大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...

  2. 【python爬虫学习记录 持续更新】多线程多进程,带线程池爬取实例

    文章目录 简介 多线程codingFrame 多进程codingFrame 线程池与进程池 线程池爬取实例(主页url隐了 主要看思路 和如何使用线程池框架) 简介 进程是资源单位 线程是执行单位 每 ...

  3. 基于requests模块的cookie,session和线程池爬取

    基于requests模块的cookie,session和线程池爬取 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三"人人网"个人主页数据)时,如果使用之前req ...

  4. 使用selenium,xpath,线程池爬取斗鱼主播信息

    使用xpath,线程池爬取斗鱼主播信息: 主要爬取主播昵称,直播内容分类,房间名称,房间号以及人气,共爬取了大概110多页数据,大概15000条,保存在txt文本中, import timefrom ...

  5. python爬虫利用线程池下载视频

    由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...

  6. python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战

    先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...

  7. 爬虫项目代理操作和线程池爬取

    代理操作 代理操作的目的 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问.所以我们需要设置一些代 ...

  8. 使用线程池爬取PPT模版

    声明: 全网最菜,只是记录分享,虚心接受点评 任务爬取目标网站PPT模版 目标地址:http://www.1ppt.com/ 分析网站结构 通过观察,我们找到模版导航,获取每一个模版导航的URL,可以 ...

  9. Python爬虫-利用xpath解析爬取58二手房详细信息

    文章目录 前言 介绍 代码 运行结果截图 前言 简单的Python练习,对页面中的某些部分的文字进行爬取 介绍 xpath解析: 最常用且最便捷高效的一种解析方式.通用型.-xpath解析原理:- 1 ...

最新文章

  1. 创新实训个人记录:approximation factor, maximum matchingvertex cover
  2. 【Linux】一步一步学Linux——w命令(227)
  3. 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC
  4. 30 个 Python 的最佳实践、小贴士和技巧,不可错过哟!
  5. java数据导出ex_Java高级特性注解:注解实现Excel导出功能
  6. 【算法升级】仅有85K个参数的开源人脸检测算法
  7. I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
  8. Java8(JDK1.8)新特性
  9. linux压力测试工具post,linux 下如何做压力测试 ab 压力测试 - 沃森博客
  10. Ubuntu版Julia安装与入门
  11. 韩昊 20190919-1 每周例行报告
  12. 数据库中存储的是什么?数据库存取的是地址
  13. 基于Java的大型网站设计方案
  14. OpenCV-Python学习(18)—— OpenCV 图像几何变换之图像平移(cv.warpAffine)
  15. Java与Unix时间戳的相互转换
  16. [数据结构] UVa1471 Defense Lines 防线
  17. pyqt5 pyqt5+opencv 实现读取视频数据
  18. java lang r,内存泄漏?为什么java.lang.ref.Finalizer吃了这么多内存
  19. c语言围棋对弈程序设计,C语言围棋对弈程序设计.doc
  20. java ssssss,在Java 7中将字符串日期转换为yyyy-MM-dd’T’HH:mm:ss.SSSSSS格式的字符串...

热门文章

  1. 小米cc9和vivo z5 对比
  2. 团队合作 职业素养课 体会
  3. 初入职场必备职业素养
  4. 【100%通过率】华为机试真题 C++ 实现【羊、狼、农夫过河】【2022.11 Q4新题】
  5. 小程序 成语猜题 数据表 分享
  6. 软件与中国古代史:政界往事(下)
  7. 【C3P0】解决使用c3p0数据库连接池的各种报错警告: Having failed to acquire a resource, com.mchange.v2.resourcepool
  8. 黑鲨能不能用鸿蒙系统,黑鲨和红魔,到底谁的散热效果更好?
  9. unity 安卓全面屏 刘海屏
  10. 媳妇居然在家偷偷背着我偷看我的面试笔记,一个月后拿下大厂offer!