这里和大家分享以下我练习爬虫爬取网站上美女图片的学习笔记,不要笑话,点进来的你也是小色批。
提前说明:各大搜索引擎用的都是爬虫,很多权威的新闻网也都在爬取相关的新闻资料,爬虫不是贬义词(当然我们绝对不能拿他来做坏事)。
我下面列出了要爬取一个网站图片的主要步骤和方法,如果要爬取其他数据应该也是一样的步骤。
目录
一、安装库文件
你也可以中规中矩的直接使用如:”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('就这么几张,没了(;′⌒`)')