前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:程序员喧啸

本文使用了requests模块进行发送请求,使用了BeautifulSoup模块对网页进行解析,在使用之前首先安装这两个第三方库;方法如下:

1.安装requests库

pip install requests

 

2. 安装bs4库

pip install bs4

 

PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取

python来爬取煎蛋网随手拍小姐姐图片

 

可以免费领取源码、项目实战视频、PDF文件等

python来爬取煎蛋网随手拍小姐姐图片

 

首先

我们打开煎蛋网,看到了首页上面有信息---随手拍,而我们的主要任务就是爬取随手拍的图片将其进行保存。

忘了说,网址是这个

http://jandan.net/ooxx/MjAyMDA4MDctMTMz#comments

 

python来爬取煎蛋网随手拍小姐姐图片

 

接下来

开始分析网页源代码,提取相关信息。那我们以什么样的思路来进行爬虫的设计呢?稍加思考,聪明的你立即有了想法,我们首先爬取整张网页的信息,之后在该网页中提取原图的保存地址,最后通过请求图片的地址,将图片进行保存。我们大体上有了一个思路,开始最有趣并且好玩的代码编写吧。

  • 首先右击页面选择审查元素(快捷键为Fn+F12),之后再点击左上角的定位符号来定位图片被存在哪一个标签里面。
  • 其次我们要将该页面的源码爬取下来,以便于下一步解析网页,直接上代码来分析。

对以下代码的注释:

  1. 我们可以看到定义了一个函数get_totle_page(url),说的高大上一点,我们采用了模块化的程序设计思想;
  2. 此处我们说另外一个高大上的名词,即UA伪装,现在好多网站都建立了反爬虫机制,UA伪装便是为了告诉浏览器我们的身份是一个浏览器,而不是一个爬虫,防止被限制访问。
  3. global headers 由于接下来我们需要访问图片的地址,发送请求信息将其存储下来,所以我们将headers定义为全局变量,方便请求图片的时候使用。
  4. 很明显,程序中我们还加入了异常处理机制,可以这么理解,当程序连接失败的时候进行异常处理,返回值为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>标签。

python来爬取煎蛋网随手拍小姐姐图片

 

最后,我们将保存着图片地址的连接都保存在了列表totle_list里面。

再下来

我们就需要将解析的图片地址链接进行二进制数据的本地存储了,为了保持我们一贯的整洁作风,咳咳咳,此处需要来一张图修饰一下······

python来爬取煎蛋网随手拍小姐姐图片

 

我们创建一个文件夹来存放所有的照片。

有意无意的插上一句,os库是python的内置库,在使用之前不需要特殊进行安装,调用即可。

    if not os.path.exists('./picture_Libs'):
        os.mkdir('./picture_Libs')

 

接下来进行请求图片的地址链接,将图片进行本地的保存。

  1. 循环遍历请求totle_list里面保存的图片的地址链接,图片是二进制文件,所以使用了response.content。
  2. 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)

 

最后

我们通过主函数将我们的各个功能模块串联起来,话不多说,上完整代码啦。

  1. 我爬取的url是"http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
  2. 在爬取煎蛋网随手拍的时候,可自行去观察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()

 

运行程序之后,我们发现了好多好看的小姐姐保存在了我创建的文件夹里面,哇,没想到一打开一张就是一个背影杀手呀,我这该死的运气。

python来爬取煎蛋网随手拍小姐姐图片
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/hhh188764/p/13459060.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!