P57 小白初试 煎蛋网 爬虫
最近刚开始学习python,很多地方都是一知半解。在学习P57时,发现煎蛋网已不能使用小甲鱼的方式进行图片爬取。经多方学习,其实就是百度,哈哈哈{:5_109:} {:5_109:} {:5_109:}
其实就是现在为了防止爬虫,将图片链接进行了加密,多打开几个页面查看一下源码就能看看出来。
类似这种:
<img src="//img.jandan.net/img/blank.gif" onload="jandan_load_img(this)" /><span class="img-hash">Ly93eDIuc2luYWltZy5jbi9tdzYwMC84NzZjMTI2MWd5MWcxY2x5d2l2bDJqMjBoODBseGRwMS5qcGc=</span><br />
所以之前的定位方法也就失效了,现在的图片路径都在img-hash里面放着呢,并且需要使用base64进行解码。
以下是我修改后的代码,希望各位不吝赐教{:5_110:} {:5_110:} {:5_110:}
# encoding: utf-8
"""
@version: 1.0
@author: Plum
"""
import urllib.request
import os
import base64
def url_open(url):
"""打开链接"""
req = urllib.request.Request(url)
req.add_header('User-Agent',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36')
response = urllib.request.urlopen(url)
html = response.read()
return html
def get_page(url):
"""获得图片展示,OOXX页面"""
html = url_open(url).decode('utf-8')
a = html.find('current-comment-page') + 23
b = html.find(']', a)
return html
def find_image(url):
"""定位图片位置"""
html = url_open(url).decode('utf-8')
img_addrs = []
#定位img-hash
a = html.find('img-hash')
while a != -1:
b = html.find('=</span>', a, a+100)
if b != -1:
#解码
base64_decrypt = base64.b64decode(html.encode('utf-8'))
html = str(base64_decrypt, 'utf-8')
img_addrs.append('http:' + html)
else:
b = a + 10
a = html.find('<span class="img-hash">', b)
return img_addrs
def save_img(img_addrs):
"""图片存储"""
for each in img_addrs:
file_name = each.split('/')[-1]
with open(file_name, 'wb') as f:
img = url_open(each)
f.write(img)
def download_img(folder='my_img', pages=57):
"""图片下载"""
os.mkdir(folder)
os.chdir(folder)
url = 'http://jandan.net/ooxx/'
page_num = int(get_page(url))
for i in range(pages):
page_num -= i
page_url = url + "page-" + str(page_num) + "#comments"
if '--' not in page_url:
img_addrs = find_image(page_url)
save_img(img_addrs)
if __name__ == '__main__':
download_img()
学习学习,看下 谢谢
看下 学习学习观摩观摩 学习一下
学习学习 222222 直接使用selenium,简单但是效率低 kankan 看一看! 学习一下 厉害 {:5_97:}学习学习 学习学习 看下 上来就会base64的大佬.. 1024
学习 6666666