python面向对象爬取肖战,王一博图片
![75e13f0f56adeb3afd04e12df951e766.png](https://i-blog.csdnimg.cn/blog_migrate/91e7e35e031c8add17a47f2729011a5c.jpeg)
今天小编向大家介绍的是用python在堆糖上爬取肖战的图片。
主要步骤:
1.获取网址
2.运用requests包模拟网站,向服务器发送请求,获取响应
3.清洗数据,通过正则表达式筛选自己需要的数据
4.保存数据
关键字:requests,正则表达式,面向对象
本文通过面向对象的方法介绍爬虫,下一期小编再介绍面向过程如何爬取。
现在就正式给大家讲解爬虫步骤。
import re # 正则表达式import requests # 爬虫用的包from urllib.request import urlretrieve # 本文用来下载图片import os # 标准库,本文用来新建文件夹1234
1.构建大体框架
构建好面向对象的大体框架,分好步骤,这样写代码思路才够清晰。
class Xiaozhan(object): def __init__(self): pass def run(self): passif __name__ == "__main__":xiaozhan = Xiaozhan()xiaozhan.run()12345678
构建好这样的框架才能饶着整个程序跑起来,run函数则是我们的主函数,那么我们在主函数里先注释好我们需要做的步骤,主要步骤则是开始写的四条。2.获取网址
def __init__(self): self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"12
![e795bc08a0aebc7bc2e30149f6177aea.png](https://i-blog.csdnimg.cn/blog_migrate/6826ed5e05231d34b4ceaf5bade4a743.jpeg)
我们接着翻到第二页
![8575babc4d071a5e8edff692d3bcfadb.png](https://i-blog.csdnimg.cn/blog_migrate/26d2677eef124124025d85d29ff10d9f.jpeg)
我再翻一页看看会怎么样
![2595b0774f1e0439885ff211c1c23723.png](https://i-blog.csdnimg.cn/blog_migrate/8bb487c60710e8733188807f863285bc.jpeg)
我们发现了规律,每翻一页s-p{}就会增加1,我们就可以通过这个规律来获取更多的网址。我们就定义获取网址的一个函数。
def Geturl(self): all_url = [] for item in range(3): all_url.append(self.base_url.format(item)) return all_url12345
定义一个列表来保存网址,通过for循环增加网址。基础网址我们已经初始化了,这里可以直接用。3.发送请求,获取响应
那么现在我们有了网址,下一波就模拟网页向服务器发送请求,获取响应。
点击鼠标右键,点击检查(小编用的谷歌浏览器,其他浏览器也可以右键)
![0552199ee4e429b46434902c3ab0ffa4.png](https://i-blog.csdnimg.cn/blog_migrate/326c3ddd74de1ffe391c53cf12975d4c.jpeg)
进来会发现这个页面,如果没有,就ctrl+r 刷新下
![7f2afcf1cc584fdbe62d3c5cf4f4469f.png](https://i-blog.csdnimg.cn/blog_migrate/85706398e3123dc556161b1cea0982b0.jpeg)
我大体介绍下这个网页的构成,这里是网页的源代码,由一个个标签组成的(小编也是初学者,目前还没有学习前端的知识,这是个人的理解)
点击network,会发现有许多选项,就随便点击一个
![bcb20062a8bfc7df387b9d1711e277f9.png](https://i-blog.csdnimg.cn/blog_migrate/3642557c31ce7d4e94adb2e60c3217d7.jpeg)
![18e1284e0881e367a0c2152ad5f35450.png](https://i-blog.csdnimg.cn/blog_migrate/15c7b489c99dccdd14e6bbf5e8d7e4e3.jpeg)
我们现在重点关注右边,往下找,会找到user_agent,这是就浏览器的信息,服务器也是通过这个信息来判断是浏览器来发送的请求,还是其他,这个非常关键。那么现有了网址,也有了user-agent,就可以模拟浏览器了。
![d6709da709d3c7262e3d121e4312cfec.png](https://i-blog.csdnimg.cn/blog_migrate/dc047f7e6050f787fa51528c4e6ca9a5.jpeg)
在初始化函数里添加我们刚刚找到的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" }12345
定义函数来获取网页的源代码,运行函数
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_list123456
![54324460e8e90f64973e5fe2f864d3c8.png](https://i-blog.csdnimg.cn/blog_migrate/4bfda0e565b99b394b2ccbfeb848e7ef.jpeg)
点击这个按钮,再去点击图片,可以快速找到该图片的源代码
![e22135fbf723a49dcdb9dcfbab2a2c2a.png](https://i-blog.csdnimg.cn/blog_migrate/8196586f5b299cd7ed0e8e814f09c3ad.jpeg)
我们发现图片的网址构成组成方式相同,都是4.清洗数据,获取图片网址
我们就创建一个新函数来清洗数据。
def clear(self, respons): for i in respons: qqq = r'' pi = re.findall(qqq, i) return pi # 返回图片的网址12345
正则表达式不清楚的可以去看小编之前的文章,讲解了如何使用正则表达式(小编这里筛选数据运用的正则表达式也不是特别好,欢迎各位批评建议)。
运行代码就可以得到图片的网址。
![1d395122f246c909a0c05c21e7b10a62.png](https://i-blog.csdnimg.cn/blog_migrate/fbc5a6831c1351fa0d74f11469a1fae1.jpeg)
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)1234567891011
循环通过网址下载图片,并保存在文件夹里。
当然,别忘了主函数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()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
运行整个程序,就可以看到当前路径多了一个肖战图片的文件夹,点开就可以看见帅气的肖战了,嘻嘻!
希望大家坚持学习,不忘初心,离自己目标越来越近!