turtle

写在前面

其实我也不知道为什么我会写这个,本文涉及信号与传递,Python

阅读更多

爬虫被403怎么办

403

先来给不知道的同学们科普一下错误码,错误码有很多啊,比如404(最常见的),那么为啥这会返还一个我们不知道是什么的码呢?
我们随便编辑一个Python爬虫程序

import requests

url = 'https://cn.chen-shang.top' # 举个栗子
a = requests.get(url)
print(a)

拿我的博客网址举个例子,我们发现终端的输出为

Response <200>

看不懂?没关系,有一个规律,2打头的都是请求成功。200的看了,来看看404

import requests

url = 'https://ccknbc.cc/405' # 菜狗的网址
a = requests.get(url)
print(a)

输出结果是什么

Response <404>

也是一个道理,4打头都是请求失败,不搞5打头了,一个4打头找了我老半天。

现在,重点分析403是个什么东西

403这玩意4打头看得出来是报错了,为啥报错呢?权限不够,403错误是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
现在很多网站的api接口返回httpcode返回码是403提示禁止访问。如果您也遇到这样的情况,请先不要急着去修改网站相关的参数
第一、先进api的网站。用浏览器访问,如果浏览器访问该api接口能成功。说明是设置了权限的问题。如果不能成功的话。很可以是该接口已修改或已失效,这时候就没办法访问了。
第二、如果浏览器能访问成功的话。那就好办了。调用该接口时,捕获异常中的responseBody,很有可能数据就在这里面,笔者就遇到的是这种问题。

也有可能是服务器看你不顺眼,把你挡在门外了,虽然我很喜欢用request,但是为了快,这次用 urllib3

import urllib.request as request
src=!["https://www.ptt.cc/bbs/movie/index.html"]
with request.urlopen(src) as response:
    data=response.read().decode('utf-8')
print(data)

在这种情况下直接对网路进行连接,一般情况下会被服务器拒绝出现这样的报错
“”“urllib.error.HTTPError: HTTP Error 403: Forbidden”“”

这种情况是网站认为你不是普通用户操作,所以我们需要模拟普通用户。
一般用户使用会给网站发送一个这总系统和浏览器的信息,所以我们需要模拟。也要向网站发送一个这样的信息。
遇到这样子的,主要是爬虫被发现了,建议用Python的正则表达式,放出我之前写的一个残次品,虽然没什么用,但是我就哪一个写了正则表达式

# coding = utf -8
import requests
import re
# url
url = 'https://www.tukuppt.com/yinxiao/'
# The detection of IP
headers = {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 FS'
}
# data
a = requests.get(url)
a = """<a class="title" target="_blank" href=“.*?”>(.*?)</a>"""
b = '<source src="(.*?)" type="audio/mpeg">'
urls = re.findall(a, b.text)
print(urls)

for url, name in zip(urls, name):
     music = requests.get('http'+url,headers)
     with open('data.txt', 'w') as f:
          f.write(music.content)
     print('<%s OK>' % name)

上面那个是我爬熊猫办公的。其实还可以更简单,就是找到你浏览器的User-Agent,像我的就是

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 FS'

加入,如下是urllib3爬ptt的

#抓取PTT电影版的网页原始码(HTML)
import urllib.request as req
url="https://www.ptt.cc/bbs/movie/index.html"
#建立一个Request物件,附加Request Headers 的资讯  
request=req.Request(url,headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
})
with req.urlopen(request) as response:
    data=response.read().decode("utf-8")
#资料解析
import bs4
root=bs4.BeautifulSoup(data,"html.parser")
titles=root.find_all("div",class_="title")
print(titles)