就当是记录我自己的学习生涯吧,起源是在实习的时候看到一个超级厉害的同事自己刚开始学习的时候就是在这上面发表一些文章和看法的,我觉得他强,自己的学习过程也可以记录一下。
我是学习java出身,但是对python也是很感兴趣,所以这上就来记录我的python学习的过程吧
首先学习爬虫,最初对于这个词汇的理解并不深刻,爬取数据?我在打开网页的时候,数据不都已经呈现在我的眼前了吗?现在的搜索引擎这么厉害,我为什么要学习网络爬虫?伴随着几年的不解和疑惑后,在了解到实际的生产生活需要,我才发现的原因。
我们平时打开网页看到的数据,在某些时候是需要记录下来的,偶尔一两个网页我们进行复制粘贴,或者手动打字都是没有问题的,但是我在经理了猎头的实习生涯之后,我发现,有时候我需要在网上查找大量的企业和公司数据,可能有几十个或者上百个,有时候还得获取各种新闻资讯材料,看到同事们也都是自己直接从网上搜索,确实很麻烦,还包括很多的网页设计的不让我们进行复制粘贴,好歹现在可以使用截图技术,进行AI识别转文字,但是依然很麻烦。
这个时候就需要爬虫了,假设我们自己要面临处理同一个大网站下,几百个网页中的数据信息,通过手动一页一页码字或者复制粘贴,就显得不太理智了(在我们有技术基础的前提下)。
假如我想要进行爬虫的爬取,我们目前有两种选择
1.基础的网页爬取,使用request库中的内容即可,用beautifulsoup4来解析爬到的HTML元素
首先在终端下载安装
pip install requests
pip install beautifulsoup4
然后在我们的python文件中导入
from bs4 import BeautifulSoup
import requests
headers = {
"User-Agent": "xxxxx指你的User-Agent"
}
首先我们要写下如上代码,因为现在的网页会拦截随机模拟的访问,我们找到自己电脑的User-Agent,就可以模仿真实的请求,而不被网页拒绝在外面。User-Agent很好找到,在开放人员工具里面点击网络,随便点击一个网络请求,里面的标头(headers)里面,找到user-agent:,然后有一大串数据,直接粘过来就行。
response = requests.get("https://www.taibo.cn/info/zaobao", headers=headers)
接下来,获得状态码,我们访问网页会返回例如200,404,502这样之类的状态码,如果后续访问网页顺利,就可以获得200,比如我们写接口,接口报错,一般就是500,请求地址出错,就是404之类的,所以200是一个让人很开心的数字。
response.encoding = "utf-8"
这条代码非常重要,让我们的编码格式变成utf-8,如果不这样,很多网页爬出的数据会是乱码。
##开始解析html内容
const = response.text
soup = BeautifulSoup(const, "html.parser")
解析完就可以把HTML元素打印出来了,都存到了soup里
print(soup)
2.存在JavaScript的动态网页爬取(这种网页反爬能力很强,根据request库中的操作无法爬到信息)使用selenium库
注:如何判断该网页是不是存在JavaScript的动态网页,需要我们拥有简单的前端知识,可以看懂HTML的格式即可,在我们需要的网页当中,按下F12,进入开发者人员工具之后,点击元素,就能看到我们当前网页的所有HTML元素了,在我们方法1中爬取到的元素打印到控制台后,如果我们搜索不到部分相关的HTML元素,就说明那一部分是动态加载的,request爬取不到,所以我们必须做出一系列技术妥协,使用selenium库,不过相比request库,selenium需要打开我们需要的网页,会导致爬取效率降低,可能速度只有request的1/5或者1/10。但是肯定比我们手动快多了。
首先在终端下载安装
pip install selenium
然后在我们的python文件中导入
from selenium import webdriver
#使用selenium进入含有javascript动态页面
# 设置Edge WebDriver的路径(如果已添加到环境变量,则可以省略)
driver_path = '你的EdgeDriver地址'
# 创建一个Service对象来管理WebDriver的启动
service = Service(executable_path=driver_path)
# 初始化WebDriver
driver = webdriver.Edge(service=service)
在这之前需要你下载你当前浏览器的Driver才行,下载后解压,复制exe文件的url地址
driver.get("你需要访问的url")
# 等待页面加载完成,这里以某个元素的可见性为例
# 注意:你需要确保页面上确实存在ID为"dynamic-content"的元素
wait = WebDriverWait(driver, 10) # 等待最多10秒
element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "article-content")))
# 获取article-content div内的所有<p>元素
p_elements = element.find_elements(By.TAG_NAME, "p")
# 遍历<p>元素并处理它们
for p in p_elements:
# 假设我们想要获取每个<p>元素的文本内容
text = p.text
# 这里可以对text进行进一步的处理或保存
if any(keyword in text for keyword in keywords):
texts.append(text)
print(text)
这段代码包含了对HTML元素的处理,对于你的元素可以类比