少女祈祷中...

最近发现,学Python而不学爬虫是真不行,所以恶补了一些爬虫。记录一下在短时间内遇到的一些问题和解决方法

爬虫请求的诚意

爬虫技术最总的归宿就是爬虫和反爬之间的博弈。服务器不想处理那些没有诚意的请求。一般来讲,在请求头中携带以下字段会提高请求的诚意。
user-agent,referer,origin,cookie

获取后端数据的API

有时候我们需要通过找到前后端通信的API,从而之间获取数据。根据我浅薄的经验,这些API大多会放在Network下的Fetch/XHR分类中。
GPT似乎也同意这个观点:
是的,你的说法是成立的。在使用浏览器的开发者工具时,特别是在“Network”(网络)选项卡中,有一个专门的“Fetch/XHR”分类。这个分类主要用于捕捉由JavaScript发起的网络请求,这些请求一般用于与后端服务器交换数据。XHR代表XMLHttpRequest,是一种在无需重新加载整个网页的情况下与服务器交换数据并更新部分网页的技术。Fetch API是一个现代的、基于Promise的替代XHR的API,用于使网络请求和操作更加容易和强大。

在进行网页爬虫开发时,如果你想要获取由JavaScript动态生成或从后端服务器通过API调用获取的数据,那么“Fetch/XHR”分类就非常有用。通过检查这个分类下的请求,你可以找到API的URL、请求方法(如GET或POST)、请求头、请求体以及服务器的响应数据。这些信息对于编写能够直接与后端API交互的爬虫代码非常重要,因为它们允许你绕过前端的JavaScript逻辑,直接获取所需的数据。

总之,通过浏览器的“Network”选项卡下的“Fetch/XHR”分类寻找后端API是一种常见且有效的方法,特别是当你需要获取由JavaScript动态生成或更新的数据时。这种方法可以帮助你更快地定位到数据来源,从而提高爬虫的效率和准确性。

编码问题

有些时候可能会遇到这样的问题

1
2
3
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
content = res.read().decode("utf-8")
1
2
    content = res.read().decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

当时遇到这个问题去稍微找了一下,一堆CSDN的垃圾,索性又去问了GPT:
这个错误通常是因为服务器返回的内容不是标准的UTF-8编码,可能是压缩过的数据。你可以尝试使用gzip库来解压缩数据,然后再进行解码。
你可以尝试以下代码来解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import gzip
import io

# 读取数据
data = res.read()

# 尝试解压缩数据
try:
with gzip.GzipFile(fileobj=io.BytesIO(data)) as f:
content = f.read().decode('utf-8')
except OSError:
# 如果不是gzip压缩的数据,直接解码
content = data.decode('utf-8')

print(content)

也是直接就解决了。