互联网上的数据量庞大,大多数以非结构化的图片、音频、文本等形式存在。这些数据不能直接用于构建机器学习模型。如果能够从这些非结构化数据中提取出有意义的信息,各行各业都将大大受益。这就是网络爬虫技术发挥作用的地方。
根据维基百科的定义,“网络爬虫、网络收割或网络数据提取是从网站提取数据的过程。这是一种复制行为,其中特定的数据被收集并从网络上复制到一个中央本地数据库或电子表格中,以供后续检索或分析。”因此,网络爬虫本质上是遍历多个网站并提取所需的信息。在Python中,Selenium和BeautifulSoup是常用的网络爬虫库。然而,将在本项目中使用Selenium。
需要注意的是,并非所有网站都允许爬虫,因此不应违反它们的条款和条件。出于同样的原因,一些网站如Twitter提供了自己的API,可以通过这些API下载所需的数据。
Selenium是一个强大的自动化工具,主要用于测试网络应用程序。它支持多种编程语言,如C#、Java、Perl、Python等,并支持Chrome、Firefox、Safari等多种浏览器。WebDriver是Selenium的主要成分,用于与网络浏览器交互。它可以执行点击按钮、填写表单、调整浏览器窗口大小、处理浏览器弹出窗口、添加或删除浏览器cookie等操作。更多关于Selenium的信息可以访问。
Selenium可以通过pip或conda在Python中安装。根据浏览器的不同,还需要ChromeDriver或GeckoDriver,可以从下载。
pip install selenium
conda install selenium
主要目标是通过爬虫技术从招聘门户网站抓取与机器学习相关的岗位信息。还将获取诸如职位名称、地点、公司名称、所需经验、提供的薪资、公司评级以及公司评论数量等信息。将执行以下操作:
所有这些操作都是自动完成的,只需要提供搜索词、要抓取的职位数量以及驱动程序的路径。
1. 导入库。将使用selenium和pandas库,可以使用以下代码导入:
from selenium.common.exceptions import NoSuchElementException
from selenium import webdriver
import time
import pandas as pd
2. 初始化WebDriver并获取URL。在打开任何URL之前,首先要初始化WebDriver,WebDriver本质上是浏览器和selenium代码之间的中介。以下代码用于初始化驱动程序并打开URL。
# 初始化chromedriver
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=path+"/chromedriver.exe", options=options)
# 打开URL
driver.get("https://www.naukri.com/")
3. 关闭不需要的弹出窗口。出于某种原因,当使用selenium打开Naukri.com网站时,会弹出一些不需要的广告形式的弹出窗口,需要关闭。为此,首先记录下主页面的窗口句柄,然后循环遍历所有打开的窗口句柄,并关闭不必要的窗口。
# 循环遍历所有打开的窗口并关闭不需要的窗口
for winId in popup_windows:
if winId != Main_Window:
driver.switch_to.window(winId)
driver.close()
# 切换到主窗口
driver.switch_to.window(Main_Window)
4. 输入所需关键词进行搜索。可以使用类名找到搜索字段,并将键入的关键词发送出去。还将获取搜索结果后的URL(这个URL稍后将被修改,如下面将看到的)。现在获取的URL具有特定格式,需要根据“?”进行分割,获取URL的两部分。
# 使用关键词进行搜索
driver.find_element_by_class_name("sugInp").send_keys(search_keyword)
driver.find_element_by_class_name("search-btn").click()
# 获取当前URL,该URL具有特定格式,稍后将被使用
get_url = driver.current_url
# 通过“?”分割获取URL的两部分
first_part = get_url.split("?")[0]
second_part = get_url.split("?")[-1]
5. 初始化空列表。将初始化一些空列表以存储必要的信息。将在最后使用这些列表构建最终的数据框架。
# 定义空列表以存储解析的值
Title = []
Company = []
Experience = []
Salary = []
Location = []
Tags = []
Reviews = []
Ratings = []
Job_Type = []
Posted = []
6. 解析。获得的搜索结果被分成多个页面,每个页面显示20个结果。为了找到要抓取的页面数量,将使用所需抓取的职位数量,并循环遍历所有页面。要抓取的页面数量可以通过使用Python中的Range函数来找到,如下所示:
range(1,int(num_of_jobs/20)+1)
要循环遍历所有搜索结果页面,将使用之前获得的URL的两部分,并形成一个新URL,如下所示:
# 利用之前定义的两部分形成新URL
url = first_part+"-"+str(i)+"?"+second_part
# 打开URL
driver.get(url)
它的工作原理是,一旦显示了搜索结果的第一页,就收集所有需要的数据并追加到相应的空列表中,然后打开上面形成的新URL,并将第二页的信息追加进来,这个循环重复进行。所以,不是点击每个页面末尾的页码,而是形成一个新URL并打开它。
7. 查找单个元素。在selenium中查找元素有很多方法,包括使用CSS选择器、类名、ID值、XPATH、标签名、部分链接文本等。要查找Experience、Salary等单个元素,首先获取页面上所有职位的列表,然后从该列表中获取单个元素。如果它们没有唯一的选择器或ID值,有时可能很难找到元素。
# 获取职位列表详细信息
job_list = driver.find_elements_by_class_name("jobTuple.bgWhite.br4.mb-8")
还将使用try和except语句来查找元素是否缺失,如果缺失,将向列表中追加一个适当的值。可以看到下面找到一个元素的示例代码:
# 获取职位发布前的天数
try:
days = element.find_element_by_css_selector('div.type.br2.fleft.grey').text
Posted.append(days)
except NoSuchElementException:
try:
days = element.find_element_by_css_selector('div.type.br2.fleft.green').text
Posted.append(days)
except NoSuchElementException:
Posted.append(None)
8. 最终数据框架。一旦所有结果的解析完成,并且所有值都追加到相应的空列表中,初始化一个空的数据框架,然后使用列表创建数据框架的列,然后可以将数据框架导出为任何需要的格式。
# 初始化空数据框架
df = pd.DataFrame()
# 为数据框架列赋值
df['Title'] = Title
df['Company'] = Company
df['Experience'] = Experience
df['Location'] = Location
df['Tags'] = Tags
df['Ratings'] = Ratings
df['Reviews'] = Reviews
df['Salary'] = Salary
df['Job_Type'] = Job_Type
df['Posted'] = Posted
df.to_csv("Raw_Data.csv",index=None)