前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:程序员喧啸
本文使用了requests模块进行发送请求,使用了BeautifulSoup模块对网页进行解析,在使用之前首先安装这两个第三方库;方法如下:
1. 安装requests库
pip install requests
2. 安装bs4库
pip install bs4
PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取
可以免费领取源码、项目实战视频、PDF文件等
首先
我们打开煎蛋网,看到了首页上面有信息---随手拍,而我们的主要任务就是爬取随手拍的图片将其进行保存。
忘了说,网址是这个
http://jandan.net/ooxx/MjAyMDA4MDctMTMz#comments
接下来
开始分析网页源代码,提取相关信息。那我们以什么样的思路来进行爬虫的设计呢?稍加思考,聪明的你立即有了想法,我们首先爬取整张网页的信息,之后在该网页中提取原图的保存地址,最后通过请求图片的地址,将图片进行保存。我们大体上有了一个思路,开始最有趣并且好玩的代码编写吧。
- 首先右击页面选择审查元素(快捷键为Fn+F12),之后再点击左上角的定位符号来定位图片被存在哪一个标签里面。
- 其次我们要将该页面的源码爬取下来,以便于下一步解析网页,直接上代码来分析。
对以下代码的注释:
- 我们可以看到定义了一个函数get_totle_page(url),说的高大上一点,我们采用了模块化的程序设计思想;
- 此处我们说另外一个高大上的名词,即UA伪装,现在好多网站都建立了反爬虫机制,UA伪装便是为了告诉浏览器我们的身份是一个浏览器,而不是一个爬虫,防止被限制访问。
- global headers 由于接下来我们需要访问图片的地址,发送请求信息将其存储下来,所以我们将headers定义为全局变量,方便请求图片的时候使用。
- 很明显,程序中我们还加入了异常处理机制,可以这么理解,当程序连接失败的时候进行异常处理,返回值为None。
def get_totle_page(url):
global headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
try:
response = requests.get(url ,headers =headers)
if response.status_code == 200:
return response.text
except requests.ConnectionError:
print("请求数据失败!!!")
return None
通过以上的操作,我们发现图片存储在<div id = "comments">里面的<ol class= "commentlist">下的每个<li>标签里面。其原图的地址保存在<li>里面的<div class = "text">下的<p>标签中的<a class = "view_img_list">标签的属性值"href"中。
这一步是将图片的地址链接解析出,我的想法是创建一个空列表totle_list = []进行存储图片的地址链接。还是一样的风格,简单粗暴,直接上代码。
我们使用的是BeautifulSoup来解析网页,先来“煲一锅汤”
soup = BeautifulSoup(html,"lxml")
前面我们分析了图片的具体保存的标签位置,下面进行解析:
div = soup.find('div',attrs = {'id':'comments'})
ol_list = div.find(name = 'ol')
for ol in ol_list.find_all(name = 'li'):
try:
text_list = ol.find('div',attrs = {'class':'text'})
#print(text_list)
global a_list
a_list = 'http:' + text_list.p.a['href']
#print(a_list)
totle_list.append(a_list)
except:
pass
#print(totle_list)
return totle_list
需要特别说明的一点,在煎蛋网随手拍的网页上面有广告信息,然而广告信息也保存在<li>标签里面,所以在解析的过程我们需要跳过保存广告的<li>标签进行解析图片,所以我们加入了异常处理机制,若<li>标签里面没有<div class = "text">,直接跳过该标签,解析下一个<Li>标签。
最后,我们将保存着图片地址的连接都保存在了列表totle_list里面。
再下来
我们就需要将解析的图片地址链接进行二进制数据的本地存储了,为了保持我们一贯的整洁作风,咳咳咳,此处需要来一张图修饰一下······
我们创建一个文件夹来存放所有的照片。
有意无意的插上一句,os库是python的内置库,在使用之前不需要特殊进行安装,调用即可。
if not os.path.exists('./picture_Libs'):
os.mkdir('./picture_Libs')
接下来进行请求图片的地址链接,将图片进行本地的保存。
- 循环遍历请求totle_list里面保存的图片的地址链接,图片是二进制文件,所以使用了response.content。
- img_path = './picture_Libs/' + totle.split('/')[-1]
对于该语句是说明了图片的本地保存地址,我们选的是新建的文件夹下面,用split()语句以“/”对地址连接进行分割,选择分割之后的最后一部分作为图片的名字来进行保存。
for totle in totle_list:
try:
response = requests.get(url=totle, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
img_data = response.content
except TimeoutError:
print('请求超时!!!')
img_path = './picture_Libs/' + totle.split('/')[-1]
#print(img_path)
with open(img_path,'wb') as fp:
fp.write(img_data)
最后
我们通过主函数将我们的各个功能模块串联起来,话不多说,上完整代码啦。
- 我爬取的url是"http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
- 在爬取煎蛋网随手拍的时候,可自行去观察url的不同,来寻找规律,来构建url进行爬取。
import requests
from bs4 import BeautifulSoup
import lxml
import os
def get_totle_page(url):
global headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
try:
response = requests.get(url ,headers =headers)
if response.status_code == 200:
return response.text
except requests.ConnectionError:
print("请求数据失败!!!")
return None
def get_content_page(html):
soup = BeautifulSoup(html,"lxml")
totle_list = []
div = soup.find('div',attrs = {'id':'comments'})
ol_list = div.find(name = 'ol')
for ol in ol_list.find_all(name = 'li'):
try:
text_list = ol.find('div',attrs = {'class':'text'})
#print(text_list)
global a_list
a_list = 'http:' + text_list.p.a['href']
#print(a_list)
totle_list.append(a_list)
except:
pass
#print(totle_list)
return totle_list
def save_img_list(message):
if not os.path.exists('./picture_Libs'):
os.mkdir('./picture_Libs')
for totle in message:
try:
response = requests.get(url=totle, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
img_data = response.content
except TimeoutError:
print('请求超时!!!')
img_path = './picture_Libs/' + totle.split('/')[-1]
#print(img_path)
with open(img_path,'wb') as fp:
fp.write(img_data)
def main():
for i in range(6):
url = "http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
html = get_totle_page(url)
message = get_content_page(html)
#print(html)
save_img_list(message)
if __name__ == "__main__":
main()
运行程序之后,我们发现了好多好看的小姐姐保存在了我创建的文件夹里面,哇,没想到一打开一张就是一个背影杀手呀,我这该死的运气。