鱼C论坛

 找回密码
 立即注册
查看: 1399|回复: 1

[已解决][爬虫]加了headers还是403了,是哪一条代码错了吗?[旧版57讲]

[复制链接]
发表于 2020-8-21 02:31:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面代码是别人的,视频是14年的,现在煎蛋这网站已经被整改过了,还上了base64加密,所以没边看边打代码,就直接找了别人的代码

但每一行我都看过去了,也没找到什么错误,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>



源代码:

  1. #从加密的煎蛋网的随手拍栏目下载图片
  2. import selenium
  3. import urllib.request
  4. import os
  5. import ssl

  6. ssl._create_default_https_context = ssl._create_unverified_context

  7. def url_open(url):  #返回普通不加密网页的源码(速度快)
  8.         req = urllib.request.Request(url)
  9.         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')
  10.         response = urllib.request.urlopen(url)
  11.         html = response.read()
  12.         return html

  13. def url_open_jm(url):   #返回加密网页的源码(速度慢)
  14.         chrome = webdriver.Chrome()
  15.         chrome.get(url)
  16.         html = chrome.page_source
  17.         return html #返回的就是字符串
  18.       
  19. '''
  20. def get_page(url): #得到最新页面的页码数(可以使用不加密读码得到,为了加快速度)
  21.         html = url_open(url)
  22.         
  23.         #然后就是查找 html 中的 'current-comment-page'
  24.         a = html.find( 'current-comment-page') + 23  #加上 23 位偏移就刚到到页码数的第一位数字
  25.         b = html.find(']', a)  #找到 a 位置之后的第一个方括号所在位置的索引坐标
  26.                
  27.         return html[a : b]  #这就是最新的页码数啦
  28. '''

  29. def get_page(url): #得到最新页面的页码数
  30.         html = url_open(url)
  31.         html = html.decode('utf-8') #因为要以字符串的形式查找,所以要 decode

  32.         #然后就是查找 html 中的 'current-comment-page'
  33.         a = html.find( 'current-comment-page') + 23  #加上 23 位偏移就刚到到页码数的第一位数字
  34.         b = html.find(']', a)  #找到 a 位置之后的第一个方括号所在位置的索引坐标
  35.                
  36.         return html[a : b]  #这就是最新的页码数啦

  37. def find_imgs(url):  #给一个页面的链接,返回所有图片地址组成的列表
  38.         html = url_open_jm(url)  #这个必须使用加密打开的方式
  39.         
  40.         img_addrs = []  #声明一个保存图片地址的列表
  41.         
  42.         #查找图片地址
  43.         #加密的网页破解后得到的图像在这里:
  44.         #<img src="http://ww3.sinaimg.cn/mw600/006XNEY7gy1fy66dacugfj30qh0zkdhu.jpg"
  45.         #所以要先找jpg,然后找img src=
  46.         
  47.         a = html.find('.jpg')
  48.         while a != -1:
  49.                 b = html.rfind('img src=', a-100, a) #在 a-100 到 a区间找 'img src=',必须反向查找
  50.                
  51.                 #如果 b 找不到,b 就返回 -1        
  52.                 if b != -1:                        
  53.                         img_addrs.append(html[b+9: a+4])
  54.                
  55.                 a = html.find('.jpg', a+4)
  56.         for each in img_addrs:
  57.                 print(each)

  58.         return img_addrs               
  59.                
  60. def save_imgs(folder, img_addrs):
  61.         for each in img_addrs:
  62.                 filename = each.split('/')[-1]
  63.                 with open(filename, 'wb') as f:
  64.                         img = url_open(each)
  65.                         f.write(img)

  66. def download_figures(folder = 'figures', page = 2):
  67.         os.mkdir(folder)  #创建文件夹
  68.         os.chdir(folder)

  69.         url = "http://jandan.net/ooxx/"  #随手拍栏目的链接,也是最新页面的链接
  70.         page_num = int(get_page(url)) #得到最新页面的页码数

  71.         for i in range(page):
  72.         
  73.                 page_url = url + 'page-' + str(page_num) + '#comments'  #得到要爬取的页面的链接
  74.                 print(page_url)
  75.                 img_addrs = find_imgs(page_url)  #得到页面所有图片的地址,保存为列表
  76.                 save_imgs(folder, img_addrs)  #保存图片到本地文件夹
  77.                 page_num -= 1  #逐步找到前几个页面

  78. if __name__ == '__main__':
  79.         download_figures()
复制代码


最佳答案
2020-8-21 10:26:46
代码第十二行
  1. response = urllib.request.urlopen(url)
复制代码
改成
  1. response = urllib.request.urlopen(req)
复制代码

没有请求构造好的请求,导致错误
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-21 10:26:46 | 显示全部楼层    本楼为最佳答案   
代码第十二行
  1. response = urllib.request.urlopen(url)
复制代码
改成
  1. response = urllib.request.urlopen(req)
复制代码

没有请求构造好的请求,导致错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 23:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表