龙空技术网

Python爬虫-爬取网站职位信息

番茄247 49

前言:

眼前看官们对“selenium定位表格元素”大致比较关怀,我们都想要了解一些“selenium定位表格元素”的相关内容。那么小编同时在网络上收集了一些关于“selenium定位表格元素””的相关知识,希望姐妹们能喜欢,你们一起来学习一下吧!

爬虫获取信息的步骤

1,首先应该获取网页显示界面的源代码

2,想办法从源代码中提取出想要的信息

3,将提取的信息存入文件/数据库中

4,结束程序

获取页面显示的源代码

selenium

selenium 是一个开源的自动化测试工具,一般用来自动化测试的,但是我们也可以使用它来获取浏览器页面的源代码。

简单来说就是我们有了它,就可以用python代码来自动让浏览器打开,并且执行相应的操作,比如点击,输入文字....

首先我们要安装一个python 的库

pip install selenium

安装好后,我们还是不能使用selenium去操纵浏览器的,我们还需要安装一个驱动。我使用的是谷歌浏览器,因此我下载的驱动也是它的驱动

在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本。

这时114版本之前的驱动

117,118,119版本的驱动可以到这里去找

当然了,网站打不开,那么可以在评论区告诉我一声,我可以帮你们下载。

好的,现在驱动已经下载完毕了,那么就将它解压,然后放在如下图所在位置:

接下来就是创建一个python项目,我们就是为例,爬取java的岗位信息

from selenium import webdriver #从selenium库中导入webdriverimport 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 = ';    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')            # 获取 <div> 标签内除了 <span> 标签外的所有子元素            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 webdriverimport timeimport pandas as pdfrom bs4 import BeautifulSoupclass lagou:    def __init__(self):        # 初始化浏览器        self.driver = webdriver.Chrome()        self.driver.maximize_window()        # 起始网址        self.start_url = ';    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')            # 获取 <div> 标签内除了 <span> 标签外的所有子元素            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框架。

标签: #selenium定位表格元素