Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章!

Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章!
最新回答
爱情,算个屁丶

2021-08-14 10:27:02

Python爬虫经常爬不到数据,可能由多种原因导致,以下是一些常见情况及对应的解决办法:

最简单的爬虫方式未成功
  • 问题表现:直接使用urllib.request.urlopen(url=某网站)或者requests.get(url=某网站)爬取数据时,无法获取到期望的数据。
  • 原因分析:部分网站对简单的爬虫请求有反爬机制,会拒绝这种基础的请求方式。
  • 解决办法

    添加请求头:有些网址爬取数据需要添加User - Agent、Cookie等字段信息。可以创建一个包含这些信息的字典,作为请求头添加到请求中。例如,在requests.get()方法中,使用headers参数传入字典类型的请求头信息。

    示例代码

import requestsurl = "目标网址"headers = { "User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)if response.status_code == 200: data = response.text print(data)else: print("请求失败,状态码:", response.status_code)数据不在网页源代码中
  • 问题表现:添加请求头后,依然访问不到数据,查看网页源代码,发现所需数据根本不在其中。
  • 原因分析:很多网站采用动态加载技术,数据是通过JavaScript等脚本在页面加载后从服务器获取并填充到页面中的,所以直接查看网页源代码无法获取到这些数据。
  • 解决办法

    查看Network中的XHR或JS:点击电脑键盘F12打开开发者工具,然后点击Network下面的XHR或JS,按F5刷新页面,查看是否有包含所需数据的请求。通常这些数据会以JSON格式存在于相应的响应中。例如爬取王者荣耀英雄皮肤时,图片下载链接在JS下面的一个json文件里。

    示例代码(获取JSON数据)

import requestsurl = "包含数据的JSON接口网址"headers = { "User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)if response.status_code == 200: json_data = response.json() print(json_data)else: print("请求失败,状态码:", response.status_code)动态加载且请求复杂的数据
  • 问题表现:像网易云音乐这类网站,虽然在Network下面能找到相应数据,但数据是通过post请求获取,请求过程较为复杂,使用前面的方法难以爬取。
  • 原因分析:post请求通常需要携带特定的参数、请求头等信息,而且可能涉及到会话管理、验证码等反爬机制,简单的get请求无法满足需求。
  • 解决办法:使用selenium模块。selenium可以模拟浏览器行为,自动处理页面加载、JavaScript执行、点击等操作,适用于动态加载且请求复杂的网页数据爬取。
  • 示例代码框架
from selenium import webdriverfrom selenium.webdriver.common.by import By# 创建浏览器驱动对象,这里以Chrome为例,需要提前下载对应版本的ChromeDriverdriver = webdriver.Chrome()# 打开目标网页driver.get("目标网址")# 通过元素定位方式找到包含数据的元素,例如通过ID、类名等# 这里只是示例,实际需要根据网页结构调整element = driver.find_element(By.ID, "元素ID")data = element.textprint(data)# 关闭浏览器driver.quit()其他可能原因及解决办法
  • IP被封禁:如果频繁请求网站,可能会被网站封禁IP,导致无法爬取数据。

    解决办法:使用代理IP,通过requests的proxies参数设置代理。

import requestsurl = "目标网址"proxies = { "http": "http://代理IP:端口", "https": "https://代理IP:端口"}response = requests.get(url, proxies=proxies)if response.status_code == 200: data = response.text print(data)else: print("请求失败,状态码:", response.status_code)
  • 网站反爬机制升级:一些网站会不断升级反爬机制,如使用验证码、行为分析等。

    解决办法:针对验证码,可以使用打码平台或者深度学习模型进行识别;对于行为分析,需要尽量模拟人类操作行为,如随机延迟、滚动页面等。