网站首页 > 精选教程 正文
爬虫获取信息的步骤
1,首先应该获取网页显示界面的源代码
2,想办法从源代码中提取出想要的信息
3,将提取的信息存入文件/数据库中
4,结束程序
获取页面显示的源代码
selenium
selenium 是一个开源的自动化测试工具,一般用来自动化测试的,但是我们也可以使用它来获取浏览器页面的源代码。
简单来说就是我们有了它,就可以用python代码来自动让浏览器打开,并且执行相应的操作,比如点击,输入文字....
首先我们要安装一个python 的库
pip install selenium
安装好后,我们还是不能使用selenium去操纵浏览器的,我们还需要安装一个驱动。我使用的是谷歌浏览器,因此我下载的驱动也是它的驱动
在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本。
这时114版本之前的驱动
https://chromedriver.storage.googleapis.com/index.html
117,118,119版本的驱动可以到这里去找
https://googlechromelabs.github.io/chrome-for-testing/
当然了,网站打不开,那么可以在评论区告诉我一声,我可以帮你们下载。
好的,现在驱动已经下载完毕了,那么就将它解压,然后放在如下图所在位置:
接下来就是创建一个python项目,我们就是www.lagou.com为例,爬取java的岗位信息
from selenium import webdriver #从selenium库中导入webdriver
import time #用来让程序休眠的
import pandas as pd #处理数据的
创建一个类,其中添加两个方法search() ,get_jobs()
class lagou:
def __init__(self):
# 初始化浏览器
self.driver = webdriver.Chrome() #这个self.driver相当于我们的浏览器对象
self.driver.maximize_window() #让窗口最大化(其实可以不用写)
# 起始网址
self.start_url = 'https://www.lagou.com/'
def search(self, keyword):
# 打开页面
self.driver.get(self.start_url)
# 关闭弹窗(首次打开页面会有弹窗,这条语句就是根据xpath来定位到关闭按钮的位置,
#然后点击关闭的,按自己需求,。)
# self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click()
# 在搜索框中输入关键字
time.sleep(2)# 这里要让程序休息两秒,是因为页面不能很快的加载出来,
#而程序运行的很快,因此要停留一会儿
self.driver.find_element_by_css_selector("#search_input").send_keys(keyword)
# 点击搜索按钮
self.driver.find_element_by_xpath("//*[@id='search_button'] ").click()
# 等待两秒5秒
time.sleep(5)
self.driver.switch_to.window(self.driver.window_handles[1])
# 获取当前页面html
page_source = self.driver.page_source
# 将职位信息添加到excel文件中
self.df = pd.DataFrame()
for i in range(30):
self.get_jobs(page_source)
print(self.df)
time.sleep(5)
# 点击前往下一页
self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click()
# 再次获取当前页面的源代码
time.sleep(2)
page_source = self.driver.page_source
# 关闭浏览器
self.df.to_excel('lagou.xlsx')
self.driver.quit()
return page_source
def get_jobs(self, page_source):
# 使用BeatufulSoup解析页面
soup = BeautifulSoup(page_source, 'lxml')
# 获取所有的招聘条目
hot_items = soup.select(".item__10RTO")
print(len(hot_items))
for item in hot_items:
d = dict()
d['job_name'] = item.select_one('#openWinPostion').get_text()
d['company'] = item.select_one('.company-name__2-SjF a').get_text()
d['salary'] = item.select_one('.money__3Lkgq').get_text()
div_tag=item.select_one('.p-bom__JlNur')
# 获取 标签内除了 标签外的所有子元素
filtered_contents = [item for item in div_tag.contents if item.name != 'span']
# 将过滤后的内容的文本内容连接起来
requirements_text = ''.join(str(content) for content in filtered_contents)
d['requirements'] = requirements_text
a = pd.Series(d)
self.df =self.df._append(a, ignore_index=True)上面selenium要实现对浏览器的操作,我们就要告诉它,我们要点击或者输入关键字的位置在哪里。
上面用到了两种selenium定位页面元素的方法
1,self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click()
怎么找到一个元素的xpath呢,我们可以借助浏览器,如上面图中选中元素,然后右键,选择复制就可以了。
这是根据xpath来定位当前页面的元素,不过在使用的过程中,我发现了一个问题:同一个页面元素,在另一个页面它的xpath就可能发生变化,因此除非只查找当前页面的某个元素位置,一般我不建议使用(当然这只是我当前的认识,说不定随着进一步学习,也会改变这个想法。)
2,self.driver.find_element_by_css_selector("#search_input").send_keys(keyword)
第二种就是根据css选择器来定位要找的元素,比如#search_input ,了解前端知识的,可能直到,它就可以定位到id=search_input的元素。
self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click() 这种是根据类名来定位的:定位的是class=lg-pagination-next的标签内一个class=lg-pagination-item-link的标签。
获取当前页面原代码,我们可以使用:page_source = self.driver.page_source
不过在使用的过程中,我也遇到了一个问题:明明我已经获取到了页面的源代码,但是得到的却是它前面页面的源码,不是我真正想要的。
self.driver.switch_to.window(
self.driver.window_handles[1]) 这条语句的作用就是帮助我们切换标签页,之后我们就可以真正获取到页面2的源代码
提取我们需要的信息
我们通过selenium获取到了很长很长一串的字符串,我们需要的所有信息都在里面,那么接下来,我们要做的就是将信息提取出来
BeautifulSoup 它是一个库,可以帮助我们解析获取的源代码。
保存数据
在找到我们想要的数据的同时,我们也需要考虑,找到的数据需要存放到一个地方,我这里选择,将其保存到excel表格中。
我这里使用了Pandas库中的DataFrame 结构,它就是一张表,在这里我将查找的数据全部存入df,然后就保存到一个lagou.xlsx文件中。
全部的完整代码如下:
from selenium import webdriver
import time
import pandas as pd
from bs4 import BeautifulSoup
class lagou:
def __init__(self):
# 初始化浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 起始网址
self.start_url = 'https://www.lagou.com/'
def search(self, keyword):
# 打开页面
self.driver.get(self.start_url)
# 关闭弹窗
# self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click()
# 在搜索框中输入关键字
time.sleep(2)
self.driver.find_element_by_css_selector("#search_input").send_keys(keyword)
# 点击搜索按钮
self.driver.find_element_by_xpath("//*[@id='search_button'] ").click()
# 等待两秒55
time.sleep(5)
self.driver.switch_to.window(self.driver.window_handles[1])
# 获取当前页面html
page_source = self.driver.page_source
# 将职位信息添加到excel文件中
self.df = pd.DataFrame()
for i in range(30):
self.get_jobs(page_source)
print(self.df)
time.sleep(5)
# 点击前往下一页
self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click()
# 再次获取当前页面的源代码
time.sleep(2)
page_source = self.driver.page_source
# 关闭浏览器
self.df.to_excel('lagou.xlsx')
self.driver.quit()
return page_source
def get_jobs(self, page_source):
# 使用BeatufulSoup解析页面
soup = BeautifulSoup(page_source, 'lxml')
# 获取所有的招聘条目
hot_items = soup.select(".item__10RTO")
print(len(hot_items))
for item in hot_items:
d = dict()
d['job_name'] = item.select_one('#openWinPostion').get_text()
d['company'] = item.select_one('.company-name__2-SjF a').get_text()
d['salary'] = item.select_one('.money__3Lkgq').get_text()
div_tag=item.select_one('.p-bom__JlNur')
# 获取 标签内除了 标签外的所有子元素
filtered_contents = [item for item in div_tag.contents if item.name != 'span']
# 将过滤后的内容的文本内容连接起来
requirements_text = ''.join(str(content) for content in filtered_contents)
d['requirements'] = requirements_text
a = pd.Series(d)
self.df =self.df._append(a, ignore_index=True)
if __name__ == '__main__':
hot = lagou()
# 搜索关键字
page_source = hot.search('java')
最后就可以得到一个文件:
其中还有点不足,就是job_name那一列还可以进行字符串操作,将地区名作为新的一列。
学习感受:最重要的一步就是获取网页源代码的那一步,我们这里使用selenium很简单就获取了网页源码,但是它也有不好的地方,比如在一些页面中,由于网速的原因,一些页面不能很快加载出来,导致selenium找不到我们要操作的位置,因此需要在一些地方适当的让程序休息一段时间,等网页顺利加载出来。
另一个缺点就是:使用selenium要花费的时间更多,不仅有让程序休眠的时间,还有网页加载的时间,我获取30页的职位信息大概就花了2~3分钟。
它的优点就是上手简单,只要了解前端构成,就可以快速实现,自己想要让浏览器自己做的事情。
在这个例子中,我们使用selenium获取源代码,beautifulSoup进行解析,pandas来将数据存储到文件。
学习下一步:scrapy框架。
猜你喜欢
- 2025-03-28 Python入门系列20-Python内置数据结构之字典
- 2025-03-28 从0教你用Python写网络爬虫,内容详细代码清晰,适合入门学习
- 2025-03-28 静态网页爬虫①(静态网页爬取实验报告)
- 2025-03-28 大数据采集系统架构方案(大数据平台数据采集系统)
- 2025-03-28 LPL比赛数据可视化,完成这个项目,用尽了我的所有Python知识
- 2025-03-28 网络爬虫开源框架(爬虫框架scrapy)
- 2025-03-28 python爬虫常用工具库总结(python爬虫工具下载)
- 2025-03-28 教您使用DynamicGecco抓取JD全部商品信息
- 2025-03-28 大数据公司发家第一步的爬虫技术,今天就来调试个开源爬虫项目
- 2025-03-28 「爬虫教程」第一章:python爬虫基础教程
你 发表评论:
欢迎
- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)