python爬虫练习(一),有挑选性的爬取网站上的美女图片

      这里和大家分享以下我练习爬虫爬取网站上美女图片的学习笔记,不要笑话,点进来的你也是小色批。

      提前说明:各大搜索引擎用的都是爬虫,很多权威的新闻网也都在爬取相关的新闻资料,爬虫不是贬义词(当然我们绝对不能拿他来做坏事)。      

      我下面列出了要爬取一个网站图片的主要步骤和方法,如果要爬取其他数据应该也是一样的步骤。

目录

一、安装库文件

二、挑选网站得到URL,获取header

三、分析网站结构,抓取网站后台代码简单分析规则

四、使用正则匹配想要的链接

五、保存到本地


一、安装库文件

      你也可以中规中矩的直接使用如:”pip install urllib“安装需要的库文件,我这里使用了清华的pip源,会快一些。

# 请求网站后台源码
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ urllib

# 获取网站编码方式
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ chardet

# 正则表达式
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ re

# 根据url请求数据(根据地址获取数据源)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests

      这里再介绍一个让系统默认调用清华pip源的方式:

      1. 打开我的电脑,在搜索框中输入:%appdata%    会进去一个名为Roaming的子文件夹

      2. 在此目录下新建pip文件夹,在pip文件夹下新建pip.ini文件

      3. pip.ini文件的内容如下,保存退出后,再使用pip install XXX会默认使用清华的pip源进行库文件的安装。

[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

二、挑选网站得到URL,获取header

      我这里是在百度搜索”图片“,然后随便点开的一个网站,美女不多大家见谅,第二讲会稍微多一点。     

# 网址
url = "http://sc.chinaz.com/tupian/xiaoqingxin.html"

      不用header可能会被网站认出我们是偷摸猥琐的小色批,如果你不知道怎么填写header,我这里有种笨方法,有目标性的获取header。

1. F12
2. 上方:Network
3. 中左:Name里任意点一个内容(没有那么就按下F5刷新一下网站)
4. 中:Headers找User-Agent
5. 复制User-Agent内容至header,如下图

     注意自己手动添加一下引号:

header = {
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64)'
        ' AppleWebKit/537.36 (KHTML, like Gecko)'
        ' Chrome/70.0.3538.25 Safari/537.36'
        ' Core/1.70.3775.400'
        ' QQBrowser/10.6.4208.400'
}

三、分析网站结构,抓取网站后台代码简单分析规则

      这个网站比较简单,先从主页开始,鼠标拖到最下面,发现总共只有9页,除第一页往后每页的url规则为:xxxx_index.html;

      每个页面只有寥寥几张美女图片,点进去后每个美女页也只有一张图片而已,切~

      谁让这个简单呢,就拿它练手了

# 主页的9个页面,这里分别打印一下
url_2 = url
for i in range(1, 10):
    print(i)
    if i != 1:
        U = list(url)
        U.insert(-5, '_'+str(i))
        url_2 = ''.join(U)
        print(url_2)
    # download_pic_0(url_2)
    # 万无一失的请求,哈哈哈
    try:
        # 如果有使用data就是post请求了,没有就是get请求
        request_url = request.Request(url=u, headers=header)
        response = request.urlopen(request_url)
    except error.HTTPError as e:
        print(e.code, '\n', e.reason, '\n', e.headers)
    except error.URLError as e:
        print(e.reason)
    else:
        print('Request successfully')
    # 自动使用匹配的网站编码打开网站内容,就不会出现乱码
    html = response.read()
    charset = chardet.detect(html)
    print(charset)  # 打印出当前网站的编码
    str_char_det = str(charset)
    str_ls_0 = str_char_det.split(',')
    str_ls_1 = str_ls_0[0].split(':')  # 锁定当前网站编码
    print(str_ls_1[1])
    html = html.decode(str_ls_1[1])  # 使用指定编码方式获取网站后台代码
    print(html)  # 打印后台源码,分析一下我们需要的东西,考虑怎么用正则的方式取出来

四、使用正则匹配想要的链接

      作为一个小色批,这网站大多数内容也太清新了吧,绿植、鲜花...啥啊。

      进过前面对网站后台代码的分析,我们知道

1. 所有的图片都有标准格式: http://sc.chinaz.com/tupian/一堆数字.htm

2. 我们要的图片后面也都带有美女字样:http://sc.chinaz.com/tupian/+一堆数字+.htm+一堆字符+美女

3. 手动滑稽:

        [0-9]+   匹配多个数字

        .+      匹配多个字符

res = re.findall('http://sc.chinaz.com/tupian/[0-9]+.htm.+美女', html)
for res_i in res:
    print(res_i)    

4. 去掉无关信息,获取美女页的网址

for res_i in res:
    # print(res_i)
    htm_x = re.match('http://sc.chinaz.com/tupian/[0-9]+.htm', res_i)
    htm = htm_x.group()
    print("得到分页的html:", htm)
    # download_pic_1(htm)

根据上一步的美女页网址,使用一样的方法获取美女页的后台源码,简单分析后发现:

1. 所有的图片都有标准格式: http://pic.sc.chinaz.com/files/pic/pic9/+一堆字符+jpg

2. 每页只有一个图片,省一个for循环了

reg = re.findall('http://pic.sc.chinaz.com/files/pic/pic9/.+jpg', html)  # 正则表达式匹配图片
    # for reg_i in reg:
    #     print(reg_i)    # 这个网站一页就一个图片,其他都是重复的,哼
print(reg[0])

五、保存到本地

      提前创建一个文件夹用于存放图片,哎,这次图片质量还是偏小清晰,小色批叨叨道:下次一定。

a = requests.get(reg[0])    # 这里是requests 不是request
# 需提前手动建好文件夹,不然会找不到地址
f = open('E:/PIC_YW/%s.jpg' % pic_index, 'wb')
f.write(a.content)
f.close()
print('%s.jpg' % pic_index, '已保存!o(* ̄▽ ̄*)ブ')
pic_index += 1

没了! 没了! 方法都告诉你了,自己去做嘛!

六、完整代码

from urllib import request, error
import chardet
import re  # 正则
import requests


pic_index = 0
url = "http://sc.chinaz.com/tupian/xiaoqingxin.html"
header = {
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64)'
        ' AppleWebKit/537.36 (KHTML, like Gecko)'
        ' Chrome/70.0.3538.25 Safari/537.36'
        ' Core/1.70.3775.400'
        ' QQBrowser/10.6.4208.400'
}
old_url = ''


def download_pic_1(u):
    global pic_index
    global old_url
    if u == old_url:
        return
    else:
        old_url = u
    try:
        # 如果有使用data就是post请求了,没有就是get请求
        request_url = request.Request(url=u, headers=header)
        response = request.urlopen(request_url)
    except error.HTTPError as e:
        print(e.code, '\n', e.reason, '\n', e.headers)
    except error.URLError as e:
        print(e.reason)
    else:
        print('Request successfully')
    html = response.read()
    charset = chardet.detect(html)
    # print(charset)  # 打印出当前网站的编码
    str_char_det = str(charset)
    str_ls_0 = str_char_det.split(',')
    str_ls_1 = str_ls_0[0].split(':')  # 锁定当前网站编码
    # print(str_ls_1[1])
    html = html.decode(str_ls_1[1])  # 自动使用匹配的网站编码打开网站内容,就不会出现乱码
    # print(html)
    reg = re.findall('http://pic.sc.chinaz.com/files/pic/pic9/.+jpg', html)  # 正则表达式匹配图片
    # for reg_i in reg:
    #     print(reg_i)    # 这个网站一页就一个图片,其他都是重复的,哼
    print(reg[0])
    a = requests.get(reg[0])    # 这里是requests 不是request
    # 需提前手动建好文件夹,不然会找不到地址
    f = open('E:/PIC_YW/%s.jpg' % pic_index, 'wb')
    f.write(a.content)
    f.close()
    print('%s.jpg' % pic_index, '已保存!o(* ̄▽ ̄*)ブ')
    pic_index += 1


def download_pic_0(u):
    # response = request.urlopen("https://www.csdn.net/")
    # 实际开发爬虫过程中,我们一般先构建request对象,
    #     再通过urlopen方法发送请求。
    #     这是因为构建的request url可以包含GET参数或POST数据以及头部信息,
    #     这些信息是普通的url不能包含的.
    try:
        # 如果有使用data就是post请求了,没有就是get请求
        request_url = request.Request(url=u, headers=header)
        response = request.urlopen(request_url)
    except error.HTTPError as e:
        print(e.code, '\n', e.reason, '\n', e.headers)
    except error.URLError as e:
        print(e.reason)
    else:
        print('Request successfully')
    html = response.read()
    charset = chardet.detect(html)
    print(charset)  # 打印出当前网站的编码
    str_char_det = str(charset)
    str_ls_0 = str_char_det.split(',')
    str_ls_1 = str_ls_0[0].split(':')  # 锁定当前网站编码
    # for str0 in strLs0:
    #     print(str0)
    print(str_ls_1[1])
    html = html.decode(str_ls_1[1])  # 自动使用匹配的网站编码打开网站内容,就不会出现乱码
    # print(html)
    # print(type(html))  # str
    # res = re.findall('http://sc.chinaz.com/tupian/[0-9]+.htm',html)
    res = re.findall('http://sc.chinaz.com/tupian/[0-9]+.htm.+美女', html)
    # print("所有html", res)
    for res_i in res:
        # print(res_i)
        htm_x = re.match('http://sc.chinaz.com/tupian/[0-9]+.htm', res_i)
        htm = htm_x.group()
        # print("得到分页的html:", htm)
        download_pic_1(htm)
    print('-----华丽的分割线-------------------------------------------------------------------')


if __name__ == "__main__":
    url_2 = url
    for i in range(1, 10):
        print(i)
        if i != 1:
            U = list(url)
            U.insert(-5, '_'+str(i))
            url_2 = ''.join(U)
            print(url_2)
        download_pic_0(url_2)
    print('就这么几张,没了(;′⌒`)')

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值