网页抓取解密(图片与下一个图片的代码主方法:第一张的网址)
优采云 发布时间: 2021-12-01 12:04网页抓取解密(图片与下一个图片的代码主方法:第一张的网址)
一般网页中,图片和下一张图片之间,地址是数字变化:
第一个的网址是:
下一篇的网址是:
一个特殊的网页会对一串数字使用加密算法,让爬虫看不到规则:
例如,第一个:
第二个:
这里的 MjAyMDA4MDktMTIx 实际上是加密信息:
查询结果:20200809显然是本次访问的日期
并121查看网页信息:即当前图片
获取当前日期的代码:
import datetime
time = datetime.datetime.now().strftime('%Y%m%')
import base64
# 获取经过base64加密后的字母串
def get_base64(s): # 传入一个待加密的字符串t
bs = str(base64.b64encode(s.encode("utf-8")), "utf-8")
return bs
测试:将字符串加密为20200809-121,结果与网页地址相同
抓取图片的代码
主要方法:
1、首先创建一个文件并命名为“ooxx”
2、get_page() 函数看起来像这样:它返回网页的数字部分
def get_page(url):
html = url_open(url).decode('utf-8')
a = html.find('current-comment-page') + 23
b = html.find(']', a)
return html[a:b]
def downloadmm(folder="ooxx", pages=10):
os.mkdir(folder)
os.chdir(folder)
url = 'http://jandan.net/ooxx/'
page_num = int(get_page(url))
for i in range(pages): # 只获取前10页的数据
page_num -= i
page_url = url + get_base64(time + str(page_num)) + '#comments'
# 找到当前页面的所有图片
img_addrs = find_imgs(page_url)
save_imgs(folder, img_addrs)
3、for i in range(pages): #只获取前10页的数据是指从当前页获取数据,第一次减0为当前页,第二次减1为下一页。以此类推,一共10页,page_url:指的是每一页的地址
4、获取page_url:关键点
测试:能否正确获取页码为121的页地址:
操作结果:
网站链接:
于是找到了页面的地址,接下来就是获取页面的源代码,从源代码中获取图片的位置
5、如何通过URL获取html页面内容:
设置请求头,目的是让爬虫操作拥有计算机的身份
import urllib.request
def url_open(url):
# 设置文件头
header = {"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
req = urllib.request.Request(url, headers=header)
# 现在开始访问
response = urllib.request.urlopen(url)
html = response.read()
# print(html)
return html
6、find_imgs 函数:通过html内容获取图片地址,正则表达式还没提到,暂时用find方法
就是获取img src之后,.jpg之前的内容。然后设置一个循环,找出当前页面所有符合条件的图片,然后保存
def find_imgs(url):
html = url_open(url).decode('utf-8')
img_addrs = []
a = html.find('img src=')
while (a != -1):
b = html.find('.jpg', a, a + 255) # 没找到就会返回-1
if b != -1:
img_addrs.append(html[a + 9:b + 4])
else:
b = a + 9
a = html.find('img src=', b)
# img_addrs存着的是所有的图片地址
for each in img_addrs:
print(each)
7、 找到地址后,下载保存
def save_imgs(folder, img_addrs):
for each in img_addrs:
filename = each.split('/')[-1]
with open(filename,'wb') as f:
img = url_open(each)
f.write(img)
filename就是给图片取个名字,img = url_open(each)然后调用函数
当我访问此页面时,我总是报告 403。
在其他页面试过,可以使用
import urllib.request
import os
import datetime
import base64
time = datetime.datetime.now().strftime('%Y%m%')
# 获取经过base64加密后的字母串
def get_base64(s): # 传入一个待加密的字符串t
bs = str(base64.b64encode(s.encode("utf-8")), "utf-8")
return bs
# print(get_base64(time + '111'))
# 打开页面
def url_open(url):
# 设置文件头
header = {"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
req = urllib.request.Request(url, headers=header)
# 现在开始访问
response = urllib.request.urlopen(url)
html = response.read()
print(html)
return html
def get_page(url):
html = url_open(url).decode('utf-8')
a = html.find('current-comment-page') + 23
b = html.find(']', a)
return html[a:b]
def find_imgs(url):
html = url_open(url).decode('utf-8')
img_addrs = []
a = html.find('img src=')
while (a != -1):
b = html.find('.jpg', a, a + 255) # 没找到就会返回-1
if b != -1:
img_addrs.append(html[a + 9:b + 4])
else:
b = a + 9
a = html.find('img src=', b)
# img_addrs存着的是所有的图片地址
for each in img_addrs:
print(each)
def save_imgs(folder, img_addrs):
for each in img_addrs:
filename = each.split('/')[-1]
with open(filename,'wb') as f:
img = url_open(each)
f.write(img)
def downloadmm(folder="ooxx", pages=10):
os.mkdir(folder)
os.chdir(folder)
url = 'http://jandan.net/ooxx/'
page_num = int(get_page(url))
for i in range(pages): # 只获取前10页的数据
page_num -= i
page_url = url + get_base64(time + str(page_num)) + '#comments'
# 找到当前页面的所有图片
img_addrs = find_imgs(page_url)
save_imgs(folder, img_addrs)
if __name__ == '__main__':
downloadmm()
原文链接: