提笔练字
普写未来
本打算实践一下python生成视频的脚本。可生成视频的第一步,请准备好背景图。
我没有背景图,于是又需要找有好看图片的网站。于是便想,能不能用爬虫给我下载一点图片呢?
想干就干了。
今日目标:用python写一个简单的爬虫,了解一下爬虫实现原理。
01、爬虫实现思路
1、分析网站
(1)确定爬取内容,确定要爬取的网站
(2)通过查看网页源代码分析数据内容
2、爬虫流程
发送请求- 获取数据 - 解析数据 - 保存数据
(1)向目标网站发送网络请求
(2)获取数据(网页源代码)
(3)解析数据(提取数据),比如相册详情页地址,标题
(4)向详情页发送网络请求
(5)获取数据(网页源代码)
(6)解析数据(提取数据图片链接)
(7)向图片链接发送请求
(8)保存数据
02、举例
我们今天以著名结构建筑两栖大师卡拉特拉瓦的个人网站为例。
- 访问网站
https://calatrava.com/projects.html?all=yes
- 找到有哪些项目,以及项目的详细介绍的网页
1)按F12 调出浏览器的开发者工具,看看这个网页是怎么构成的
a)我们可以看到所有的项目信息都在一个
b)在这个标签中,每个项目又分别对应了一个
- 的标签,li标签的class名是odd或者even
-
c)利用Beautifulsoup的find_all方法,我们就可以拆分出这个页面中出现的每个项目的网页信息
2)在项目详细介绍的网页找到高清大图的地址
a)按F12 进入到浏览器的开发者模式
b)进入Network标签页,找到大图的实际地址
c)通过大图的实际地址转到element标签页中Ctrl+F进行查找,这样我们可以解析出隐藏在翻页动画背后的高清大图的存储结构。
d)至此我们可以发现页面的动画效果是通过一个JavaScript代码实现的,而每个项目的大图都是结构化的存储在这段json对象中,那我们直接用正则表达式提取出来就好了。
03、源码
import requests, re, os from bs4 import BeautifulSoup # 输入大师的网址,这里的r是转义符 project_url = r'https://calatrava.com/projects.html?all=yes' # 访问网站的模块,以后需要访问网站的时候都会用到这个函数 def download_page(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0' } data = requests.get(url, headers=headers).content.decode('utf-8') return data # 解析得到标题与项目地址的列表 # 拆分出:1.每个项目的信息 def parse_html(url): html = download_page(url) soup = BeautifulSoup(html, features='lxml') project_list_part=soup.find("div",{"class":"mod_cal_project_list thumb_view block"}) project_list_soup = project_list_part.find_all('li', {'class': {'odd',"even"}}) return project_list_soup # 在项目信息中提取项目的名称,得到一个列表 def get_project_title(project_list_soup): project_title = [] for link in project_list_soup: project_year = link.find('span', {'class': 'year'}) links = link.find('a')['href'] name = str(project_year.string) + '--'+ str(links[9:-5]) project_title.append(name) return project_title # 解析出每个项目的地址,得到一个列表 def get_project_link(project_list_soup): project_link = [] for link in project_list_soup: links = link.find('a')['href'] #因为项目的详细页面的默认状态是看文字介绍,所以还需要在后面加入一个进入画廊状态的字符串 links = str(r"https://calatrava.com/" + links+r"?view_mode=gallery") project_link.append(links) return project_link # 解析项目子项页面,得到图片地址的列表 def parse_sub_html(project_link): html = download_page(project_link) project_soup = BeautifulSoup(html, features='lxml') # 抓取JavaScript代码,解析出图片存放的实际地址 project_img_links_script=project_soup.find_all("script") project_img_links=re.findall(r"'(?P<addr>files.*)', title",str(project_img_links_script)) for i in range(len(project_img_links)): project_img_links[i]=str(r"https://calatrava.com/")+project_img_links[i] # print(str(project_img_links_script)) print(project_img_links) #print("此项目大图数量 = "+len(project_img_links)) return project_img_links # 根据图片地址的列表,设定命名规则,保存图片 def save_img(links, name): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} os.makedirs('./Calatrava project img/', exist_ok=True) t = 1 for link in links: filename = str('./Calatrava project img/' + str(name) + '%s.jpg' % (repr(t))) print("Downloading----",str(filename)) with open(filename, "wb") as img: img.write(requests.get(link, headers=headers).content) t += 1 def main(): soup = parse_html(project_url) # 得到项目名称以及项目地址 name = get_project_title(soup) link = get_project_link(soup) print(link) # 进入项目子项地址下载图片 # 引入项目代号t可以从第t个项目开始下载,以防网络错误 t = 0 while t < len(name): # 考虑空项目地址引起download函数报错 if link[t] == "": print("Skip it,Because it is null,Hurry coding,,Fix it later") t += 1 else: img_list = parse_sub_html(link[t]) print('Project Name is :', name[t]) save_name = str(repr(t + 1)+"-" + name[t]) save_img(img_list, save_name) print('No %s is ok' % repr(t + 1)) t += 1 if __name__ == '__main__': main()
04、下载的图片
图片终于下载完了,我一下子不知道,我本来是打算用它来做什么的啊。
今天天气好冷,好想躺在床上休息。
05、总结
突然有一点不知道,我这么认真的写CSDN是为了什么,花了好长的时间。
认真的去收集素材,认真的去验证代码,然后写出自己的成果。然后世界这么大,技术这么广,越查越发现我不会的太多太多了。
我要学会取舍。
也许我该学着使用项目管理中的知识,对于要做的任务列出计划表,然后按计划表去执行。
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
若有侵权,请联系删除