一、前言
2020-04-07日爬虫练习
每日一个爬虫小练习,学习爬虫的记得关注哦!
学习编程就像学习骑自行车一样,对新手来说最重要的是持之以恒的练习。
在《汲取地下水》这一章节中看见的一句话:“别担心自己的才华或能力不足。持之以恒地练习,才华便会有所增长”,现在想来,真是如此。
二、需求
2.1 意义
很多人装修完房子,感觉房子不好看?是因为前期工作没做到位,我家就是这样。正好闲暇,看到一些很漂亮的装修效果图,就想如果我家装修之前能看到这样的装修风格就好了。
2.2 户型分类:
于是,于是 我就找了一家比较大的装修平台,死命薅,算了一下,总计爬了
- 一居室装修示意图 : 205套
- 二居室装修示意图: 966套
- 三居室装修示意图: 2591套
- 四居室装修示意图:979套
- 复式装修示意图:331套
- 别墅装修示意图:694套
- 其他建筑:7套
看到各种装修风格的效果图,相信里面总有一款适合你。
2.3 风格分类:
2.4 风格的风格分类:
三、技术路线
1.requests
2.BeautifulSoup
3.re
具体模块用法可以关注我的免费专栏:爬虫学习笔记
四、总结
1、爬虫一定要加上异常处理,不让自己的程序因为异常而崩溃。
2、代码写不出来,得安装步骤来
- 拿到需求,先分析实现的思路
- 把实现的思路边分析边记录下来
- 写实现代码
- 拿不准的地方,边分析、边写思路然后就编写代码也是可以的。
- 坚持,多练习
3、该代码还有很多优化的地方,晚点上多线程爬取的源代码,如果爬取有问题,评论告诉我。
五、源代码
'''
爬土巴兔装修效果图,按分类爬取
version:01
author:金鞍少年
Blog:https://jasn67.blog.csdn.net/
date:2020-04-08
'''
import requests
import random, os, sys
from bs4 import BeautifulSoup
import re
class House_renderings():
def __init__(self):
# 户型
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/'
}
# 代理ip
self.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/' # 本地存储目录
# 请求url,获取html
def 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 html
except:
print('链接失败!')
# 获取page分页
def get_page_urls(self, url, html):
try:
Pages = list(html.find('div', class_="pages").find_all('a'))[-2].string
for page in range(1, int(Pages) + 1):
page_url = url+'p{}'.format(page)
yield page_url
except AttributeError:
yield url
# 获取详情页面url
def get_detail_urls(self, html):
a_tag = html.find('div', class_="xmp_container").find_all('a', class_="item_img")
for a in a_tag:
detail_urls = 'https:' + a['href']
yield detail_urls
# 获取详情页内容,并保存到本地
def Save_detail_page(self, detail_html):
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('{}图集:{}效果图下载成功,!'.format(atlas_name, index))
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() # 获取户型url
house_classify_html = self.get_html(house_classify_url) # 获取首页html
for page_url in self.get_page_urls(house_classify_url, house_classify_html): # 获取分页url
try:
page_html = self.get_html(page_url) # 获取分页html
for detail_url in self.get_detail_urls(page_html): # 获取详情页url
detail_html = self.get_html(detail_url) # 获取详情页html
self.Save_detail_page(detail_html) # 获取图片集,并保存到本地
except Exception as e:
print(f'抓取失败,失败原因:{e}')
continue # 循环中遇到异常跳过继续运行
if __name__ == '__main__':
h = House_renderings()
h.func()
六、实现效果
![](https://img-blog.csdnimg.cn/20200408154205394.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ0NDY5Mw==,size_16,color_FFFFFF,t_70