使用BeautifulSoup实现网页爬虫的反爬虫技巧
- 更改User-Agent头信息
User-Agent 头部是客户端向服务端发送的包含设备和浏览器信息的字符串。很多反爬虫机制会对 User-Agent 头部进行识别,如果检测到是爬虫的 User-Agent,则会返回伪造数据。我们可以通过设置不同的 User-Agent 来规避这一反爬虫机制。
举个例子,我们使用 requests 库下载皮蛋编程网站的内容:
import requests url = 'https://pidancode.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get(url, headers=headers) print(response.content)
在上面的代码中,我们使用了一个模拟浏览器的 User-Agent 头信息。这样我们就可以访问到网站的内容了。
- 限制访问频率
在网站上设置了访问频率限制的反爬虫机制,如果我们过于频繁地访问网站,则会被封禁 IP 或者被要求输入验证码。因此,针对这种情况,我们需要限制访问频率。
我们可以在代码中设置一个时间间隔,让程序间断地访问网站。这样既可以防止被封禁 IP,也可以减少服务器的压力。
import requests import time url = 'https://pidancode.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } for i in range(10): response = requests.get(url, headers=headers) print(response.content) time.sleep(1)
在上面的代码中,我们设置了一个时间间隔为 1 秒,让程序每秒钟访问一次网站,这样就可以避免过于频繁地访问网站。
- 使用代理
当我们访问网站时,网站会记录我们的 IP 地址并对其进行检测。如果我们使用同一个 IP 地址多次访问网站,就很容易被封禁。为了规避这种反爬虫机制,我们可以使用代理。
代理可以隐藏我们的 IP 地址,让我们看起来像是从不同的地方访问网站。这样就可以规避 IP 地址被封禁的问题。
import requests url = 'https://pidancode.com/' proxies = { 'http': 'http://127.0.0.1:8080', 'https': 'https://127.0.0.1:8080' } response = requests.get(url, proxies=proxies) print(response.content)
在上面的代码中,我们使用了一个代理服务器来访问网站。这样我们就可以隐藏真实的 IP 地址,并且可以更轻松地避开反爬虫机制。
- 解析 JavaScript 渲染的页面
有些网站是使用 JavaScript 来渲染页面的,但是 requests 库只能获取静态的 HTML 内容。因此,我们需要使用其他库来解析 JavaScript 渲染的页面。
其中比较常用的解析器是 Selenium 和 Splash。Selenium 是一个自动化测试工具,可以模拟浏览器的行为,并且可以解析动态页面。Splash 是基于 QTWebkit 的一个 JavaScript 渲染服务,可以让爬虫模拟页面的渲染。
下面是使用 Selenium 访问皮蛋编程网站的代码:
from selenium import webdriver url = 'https://pidancode.com/' browser = webdriver.Chrome() browser.get(url) print(browser.page_source) browser.quit()
在上面的代码中,我们使用了 Selenium 模拟一个 Chrome 浏览器,并且访问了皮蛋编程网站。因为 Selenium 可以解析 JavaScript 渲染的页面,所以我们可以得到网站的完整内容。
- 解析动态生成的页面
有些网站是使用动态生成的页面,这些页面是通过 Ajax 请求得到的,因此无法通过 requests 库获取。为了解析这种动态生成的页面,我们需要模拟 Ajax 请求并且解析返回的数据。
可以使用 requests 库发送 Ajax 请求,并且解析返回的 JSON 数据。
下面是通过 Ajax 请求得到皮蛋编程网站文章的代码:
import requests url = 'https://pidancode.com/wp-json/wp/v2/posts' params = {'per_page': 10} response = requests.get(url, params=params) data = response.json() for post in data: print(post['title']['rendered'])
在上面的代码中,我们通过 Ajax 请求得到了最近发布的 10 篇文章,并且解析了 JSON 数据。
相关文章