JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Python爬虫-爬取网站职位信息(如何用python爬取网站数据)

wys521 2025-03-28 22:38:28 精选教程 8 ℃ 0 评论


爬虫获取信息的步骤

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框架。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表