今天小编想大家介绍的是用python在堆糖上爬取肖战的图片。
1.获取网址
2.运用requests包模拟网站,向服务器发送请求,获取响应
3.清洗数据,通过正则表达式筛选自己需要的数据
4.保存数据
关键字:requests,正则表达式,面向对象
本文通过面向对象的方法介绍爬虫,下一期小编在介绍面向过程如何爬取。
现在就正式给大家讲解爬虫步骤。
import re # 正则表达式
import requests # 爬虫用的包
from urllib.request import urlretrieve # 本文用来下载图片
import os # 标准库,本文用来新建文件夹
1.构建大体框架
构建好面向对象的大体框架,分好步骤,这样写代码思路才够清晰。
class Xiaozhan(object):
def __init__(self):
pass
def run(self):
pass
if __name__ == "__main__":
xiaozhan = Xiaozhan()
xiaozhan.run()
构建好这样的框架才能饶昂整个程序跑起来,run函数则是我们的主函数,那么我们在主函数里先注释好我们需要做的步骤,主要步骤则是开始写的四条。
2.获取网址
def __init__(self):
self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"
我们接着翻到第二页
我在翻一页看看会怎么样
我们发现了规律,每翻一页s-p{}就会增加1,我们就可以通过这个规律来获取更多的网址。我们就定义获取网址的一个函数。
def Geturl(self):
all_url = []
for item in range(3):
all_url.append(self.base_url.format(item))
return all_url
定义一个列表来保存网址,通过for循环增加网址。基础网址我们已经初始化了,这里可以直接用。
3.发送请求,获取响应
那么现在我们有了网址,下一波就模拟网页想服务器发送请求,获取响应。
点击鼠标右键,点击检查(小编用的谷歌浏览器,其他浏览器也可以右键)
进来会发现这个页面,如果没有,就ctrl+r 刷新下
我大体介绍下这个网页的构成,这里是网页的源代码,又一个个标签组成的(小编也是初学者,目前还没有学习前端的知识,这是个人的理解)
点击network,会发现有许多选项,就随便点击一个
我们现在重点关注右边,往下找,会找到user_agent,这是就浏览器的信息,服务器也是通过这个信息来判断是浏览器来发送的请求,还是其他,这个非常关键。那么现有了网址,也有了user-agent,就可以模拟浏览器了。
在初始化函数里添加我们刚刚找到的user-agent,注意要用字典的形式。
def __init__(self):
self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"
self.header = {"user-agent":
"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36"
}
定义函数来获取网页的源代码,运行函数
def Respons(self, all_url):
text_list=[]
for url in all_url:
r = requests.get(url, headers=self.header)
text_list.append(r.text)
return text_list
点击这个按钮,再去点击图片,可以快速找到该图片的源代码
我们发现图片的网址构成组成方式相同,都是 4.清洗数据,获取图片网址
我们就创建一个新函数来清洗数据。
def clear(self, respons):
for i in respons:
qqq = r''
pi = re.findall(qqq, i)
return pi # 返回图片的网址
正则表达式不清楚的可以去看小编之前的文章,讲解了如何使用正则表达式(小编这里筛选数据运用的正则表达式也不是特别好,欢迎各位批评建议)。
运行代码就可以得到图片的网址。
5.保存数据
def save(self, url_list):
i = 0
# print(url_list)
if not os.path.exists("肖战图片"):
os.mkdir("肖战图片") # 判断有没有该文件夹,如果没有就创建改文件夹
for url in url_list:
i = i + 1
print(url)
file_path = "./肖战图片" + "/" + str(i) + ".jpg"
urlretrieve(url, file_path) # 下载图片,具体的用法可以去搜索下,很简单的
print("第%d张图片下载成功" % i)
循环通过网址下载图片,并保存在文件夹里。
当然,别忘了主函数run函数的完善,小编没有具体讲,主要就是调用乡音的函数就好了。
完整代码展示
最后展示下完整的代码。
import re # 正则表达式
import requests # 爬虫用的包
from urllib.request import urlretrieve # 本文用来下载图片
import os # 标准库,本文用来新建文件夹
class Xiaozhan(object):
def __init__(self):
self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"
self.header = {"user-agent":
"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36"
}
def Geturl(self):
all_url = []
for item in range(3):
all_url.append(self.base_url.format(item))
print(len(all_url))
return all_url # 返回全部网址
def Respons(self, all_url):
text_list = []
for url in all_url:
r = requests.get(url, headers=self.header)
text_list.append(r.text)
return text_list # 返回网址的源代码
def clear(self, respons):
for i in respons:
qqq = r''
pi = re.findall(qqq, i)
return pi # 返回图片的网址
def save(self, url_list):
i = 0
# print(url_list)
if not os.path.exists("肖战图片"):
os.mkdir("肖战图片") # 判断有没有该文件夹,如果没有就创建改文件夹
for url in url_list:
i = i + 1
print(url)
file_path = "./肖战图片" + "/" + str(i) + ".jpg" # 文件路径
urlretrieve(url, file_path) # 下载图片,具体的用法可以去搜索下,很简单的
print("第%d张图片下载成功" % i)
def run(self):
# 1.获取网址的列表
titile_url = self.Geturl()
# print(titile_url)
# 2.发送请求,获取响应
respons = self.Respons(titile_url)
# print(respons)
# 3.通过正则表达式清洗数据
picture = self.clear(respons)
print(picture)
# 4.保存数据
download = self.save(picture)
# print(download)
if __name__ == "__main__":
xiaozhan = Xiaozhan()
xiaozhan.run()
运行整个程序,就可以看到当前路径多了一个肖战图片的文件夹,点开就可以看见帅气的肖战了,嘻嘻!
希望大家坚持学习,不忘初心,离自己目标越来越近!