python爬取网站图片

爬虫小练习。看妹子 ( ͡° ͜ʖ ͡°)

主要步骤:

  1. 获取网页地址,找到图片地址所在标签

  2. 用beautifulsoup解析出图片实际地址以及图片标题

  3. 分析网页页面逻辑,找出最终页码

  4. 写入循环,在每页将图片写入到本地

主要代码

1
2
start_html = requests.get(baseUrl, headers= headers)
content = start_html.content

这里用.content是为了避免网页编码和python编码不同而导致中文乱码问题,各个网站的编码都不一样,有些事utf-8,有些事GBK,还有其他的。这里可以避免编码影响。

按F12,检查图片地址所在标签,见下图 图片地址 右键->copy selecter,可以看到,图片所在标签为

1
div > div.ui-main > div:nth-child(9) > div.mala-text

所以在beautifulsoup中图片地址选择可以写成

1
img_url = img_soup.find('div', class_='ui-main').find_all('img')

可以找出此页面所有img标签。同理可以找到图片标题。但是此处找到的是所在标签,打印出来的是

1
2
3
<img alt="美女" src="http://wx4.sinaimg.cn/mw600/680f28e6gy1ffi9650prlj20dw0iidj6.jpg" style="width: 350px; height: 466px;">

<a href="/miss/7159.html">美女</a>

所以声明一个新的变量来提取图片地址,同理得到标题

1
2
imgs = img_url['src'] #图片地址
name = titles.tet_text()

最后,找到页码标签, 页码 可以看到末页标签是在page类下的最后一个,所以我们可以用

1
2
3
4
maxPages = soup.find('div',class_='page').find_all('a')[-1]['href']
maxpage0 = re.findall('\d+',maxPages)
#最大页面值
maxpage = maxpage0[0] #最终页码 值类型为int

soup找到的结果为一个数组,所以我们还要处理一下得到一个数字。

最后,图片的写入以及文件夹的创建。因为每一页都有八张图(最后一页不一定,因此页面循环时不要循环到最后一页),所以每一页循环八次获取图片。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    path = str(page)
    #如果文件夹已经存在,再次创建会出错,所以这里用了一个if循环
    if os.path.exists('D:\meizitu\\'+path):
        print('文件夹已存在')
    else:
        os.makedirs(os.path.join("D:\meizitu",path)) #创建文件夹
    os.chdir("D:\meizitu\\"+path)
    for i in range(0,8):
        name = titles[i].get_text()  #图片标题
        imgs = img_url[i]['src']
        img = requests.get(imgs,headers=headers)
        #因为图片类型主要是JPG和GIF两种,所以这里也写一个if选择
        if imgs[-3:] == "gif":
            f = open(name+'.gif','ab')
            f.write(img.content)
            f.close()
        else:
            f = open(name + '.jpg', 'ab')
            f.write(img.content)
            f.close()

最终代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- coding:utf-8 -*-
# _author_:shineee

import requests
from bs4 import BeautifulSoup
import os
import re

headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上)
baseUrl = 'http://www.qiubaichengren.com'
start_html = requests.get(baseUrl, headers= headers)
##将原网页内容提取出来。避免编码不同造成中文乱码
content = start_html.content
##声明soup变量,然后找出图片地址
soup = BeautifulSoup(content, 'lxml')
#末页
maxPages = soup.find('div',class_='page').find_all('a')[-1]['href']
maxpage0 = re.findall('\d+',maxPages)
#最大页面值
maxpage = maxpage0[0] #因为正则表达式出来的是数组,所以这里提取数组中的第一个数,也是唯一一个

for page in range(1,5):#这里5可以改成maxpage,但是太多了- -八百多页呢,喜欢的话自己可以慢慢等。。
    page_url = baseUrl + '/' + str(page) + '.html'
    img_html = requests.get(page_url,headers= headers)
    img_soup = BeautifulSoup(img_html.content,'lxml')
    img_url = img_soup.find('div', class_='ui-main').find_all('img')
    titles = img_soup.select('div[class="mtitle"]')  ##获取图片标题
    path = str(page)
    if os.path.exists('D:\meizitu\\'+path):
        print('文件夹已存在')
    else:
        os.makedirs(os.path.join("D:\meizitu",path)) #创建文件夹
    os.chdir("D:\meizitu\\"+path)
    for i in range(0,8):
        name = titles[i].get_text()  #图片标题
        imgs = img_url[i]['src']
        img = requests.get(imgs,headers=headers)
        if imgs[-3:] == "gif":
            f = open(name+'.gif','ab')
            f.write(img.content)
            f.close()
        else:
            f = open(name + '.jpg', 'ab')
            f.write(img.content)
            f.close()
    print('第'+str(page) +'页写入完成')
print('写入完毕。')
Licensed under CC BY-NC-SA 4.0
最后更新于 2017-04-23 09:23:24
Made By ❤️ishineee_
使用 Hugo 构建
主题 StackJimmy 设计