|  | 
 
| 
下面代码是别人的,视频是14年的,现在煎蛋这网站已经被整改过了,还上了base64加密,所以没边看边打代码,就直接找了别人的代码
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 但每一行我都看过去了,也没找到什么错误,headers也换成我自己的了还是显示了403 forbidden
 
 但我在IDLE里单单进行这个操作却没问题
 IDLE的交互:
 >>> import urllib.request as r
 >>> b = r.Request('http://jandan.net/ooxx')
 >>> b.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36')
 >>> r.urlopen(b)
 <http.client.HTTPResponse object at 0x7f8629990550>
 
 
 
 源代码:
 
 
 复制代码#从加密的煎蛋网的随手拍栏目下载图片
import selenium 
import urllib.request
import os
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def url_open(url):  #返回普通不加密网页的源码(速度快)
        req = urllib.request.Request(url)
        req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36')
        response = urllib.request.urlopen(url)
        html = response.read()
        return html
 
def url_open_jm(url):   #返回加密网页的源码(速度慢)
        chrome = webdriver.Chrome()
        chrome.get(url)
        html = chrome.page_source
        return html #返回的就是字符串
       
'''
def get_page(url): #得到最新页面的页码数(可以使用不加密读码得到,为了加快速度)
        html = url_open(url)
        
        #然后就是查找 html 中的 'current-comment-page'
        a = html.find( 'current-comment-page') + 23  #加上 23 位偏移就刚到到页码数的第一位数字
        b = html.find(']', a)  #找到 a 位置之后的第一个方括号所在位置的索引坐标
                
        return html[a : b]  #这就是最新的页码数啦
'''
def get_page(url): #得到最新页面的页码数
        html = url_open(url)
        html = html.decode('utf-8') #因为要以字符串的形式查找,所以要 decode
 
        #然后就是查找 html 中的 'current-comment-page'
        a = html.find( 'current-comment-page') + 23  #加上 23 位偏移就刚到到页码数的第一位数字
        b = html.find(']', a)  #找到 a 位置之后的第一个方括号所在位置的索引坐标
               
        return html[a : b]  #这就是最新的页码数啦
 
def find_imgs(url):  #给一个页面的链接,返回所有图片地址组成的列表
        html = url_open_jm(url)  #这个必须使用加密打开的方式
        
        img_addrs = []  #声明一个保存图片地址的列表
        
        #查找图片地址
        #加密的网页破解后得到的图像在这里:
        #<img src="http://ww3.sinaimg.cn/mw600/006XNEY7gy1fy66dacugfj30qh0zkdhu.jpg" 
        #所以要先找jpg,然后找img src=
        
        a = html.find('.jpg') 
        while a != -1:
                b = html.rfind('img src=', a-100, a) #在 a-100 到 a区间找 'img src=',必须反向查找
                
                #如果 b 找不到,b 就返回 -1        
                if b != -1:                        
                        img_addrs.append(html[b+9: a+4])
                
                a = html.find('.jpg', a+4)
        for each in img_addrs:
                print(each)
 
        return img_addrs               
                
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 download_figures(folder = 'figures', page = 2):
        os.mkdir(folder)  #创建文件夹
        os.chdir(folder)
 
        url = "http://jandan.net/ooxx/"  #随手拍栏目的链接,也是最新页面的链接
        page_num = int(get_page(url)) #得到最新页面的页码数
 
        for i in range(page):
        
                page_url = url + 'page-' + str(page_num) + '#comments'  #得到要爬取的页面的链接
                print(page_url)
                img_addrs = find_imgs(page_url)  #得到页面所有图片的地址,保存为列表
                save_imgs(folder, img_addrs)  #保存图片到本地文件夹
                page_num -= 1  #逐步找到前几个页面
 
if __name__ == '__main__':
        download_figures()
 
 
代码第十二行 复制代码response = urllib.request.urlopen(url)
改成 复制代码response = urllib.request.urlopen(req)
没有请求构造好的请求,导致错误 | 
 |