赞
踩
这段代码是一个爬取Boss直聘网站上数据岗位信息的爬虫程序。它使用了异步编程库asyncio和网页自动化测试库pyppeteer来实现异步的网页爬取和数据提取。
- import asyncio # 异步编程库
- import random # 随机数生成库
- import csv # CSV文件处理库
- from pyppeteer import launch # 网页自动化测试库
- from lxml import etree # XML和HTML解析库
-
-
- class Boss(object):
- def __init__(self):
- self.data_list = list() # 数据列表
-
- def screen_size(self):
- """使用tkinter获取屏幕大小"""
- import tkinter # GUI工具库
- tk = tkinter.Tk() # 创建窗口
- width = tk.winfo_screenwidth() # 获取屏幕宽度
- height = tk.winfo_screenheight() # 获取屏幕高度
- tk.quit() # 关闭窗口
- return width, height # 返回屏幕宽度和高度
-
- async def main(self):
- try:
- browser = await launch(
- headless=False, # 是否无头模式(可见/不可见浏览器)
- userDataDir="./config", # 用户数据目录(用于保持浏览器会话)
- args=['--disable-infobars', '--window-size=1366,768', '--no-sandbox'] # 启动参数
- )
-
- page = await browser.newPage() # 创建新页面
- width, height = self.screen_size() # 获取屏幕大小
- await page.setViewport({'width': width, 'height': height}) # 设置页面视口大小
-
- await page.goto(
- 'https://www.zhipin.com/?city=100010000&ka=city-sites-100010000') # 打开目标网页
- await page.evaluateOnNewDocument(
- '''() =>{ Object.defineProperties(navigator, { webdriver: { get: () => false } }) }'''
- ) # 修改浏览器环境,防止被检测为自动化测试工具
- await asyncio.sleep(5) # 等待页面加载
-
- # 查询数据岗位
- await page.type(
- '#wrap > div.column-search-panel > div > div > div.search-form > form > div.search-form-con > p > input',
- '大数据', {'delay': self.input_time_random() - 50}
- ) # 在搜索框中输入关键词
- await asyncio.sleep(2) # 等待输入完成
-
- # 点击搜索按钮
- await page.click('#wrap > div.column-search-panel > div > div > div.search-form > form > button')
- await asyncio.sleep(5) # 等待搜索结果加载
-
- i = 0
- while True:
- await asyncio.sleep(2) # 等待页面加载
- content = await page.content() # 获取页面内容
- html = etree.HTML(content) # 解析页面内容
- self.parse_html(html) # 解析内容
- await page.click(
- '#wrap > div.page-job-wrapper > div.page-job-inner > div > div.job-list-wrapper > div.search-job-result > div > div > div > a:nth-child(10)'
- ) # 点击下一页按钮
- await asyncio.sleep(3) # 等待页面加载
- i += 1
- print(i)
- # boss直聘限制翻页为10页,分省分批次抓取
- if i >= 10:
- break
- except Exception as a:
- print(a)
-
- def input_time_random(self):
- return random.randint(100, 151) # 生成随机的输入延迟时间
-
- def parse_html(self, html):
- li_list = html.xpath('//div[@class="search-job-result"]//ul[@class="job-list-box"]/li') # 获取职位列表
- for li in li_list:
- job_name = li.xpath('.//span[@class="job-name"]/text()')[0] # 工作名称
- job_salary = li.xpath('.//div[@class="job-info clearfix"]/span/text()')[0] # 薪资待遇
- company_name = li.xpath('.//div[@class="company-info"]//h3/a/text()')[0] # 公司名称
- job_exp = li.xpath('.//div[@class="job-info clearfix"]/ul/li/text()')[0] # 年限要求
- job_address = li.xpath('.//span[@class="job-area"]/text()')[0] # 工作地点
- welfare = ' '.join(li.xpath('.//div[@class="info-desc"]/text()')) # 福利待遇
- demand = ''
- span_list = li.xpath('.//div[@class="job-card-footer clearfix"]/ul[@class="tag-list"]')
- for span in span_list:
- demand = ' '.join(span.xpath('./li/text()')) # 任职需求
- print(job_name, job_salary, job_address, job_exp, company_name, demand, welfare)
-
- with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
- csv_writer = csv.writer(f)
- csv_writer.writerow([job_name, job_salary, job_address, job_exp, company_name, demand, welfare]) # 保存数据
-
- def run(self):
- asyncio.get_event_loop().run_until_complete(self.main()) # 运行异步任务
-
-
- if __name__ == '__main__':
- with open('boss_data.csv', encoding='utf-8', mode='a', newline='') as f:
- csv_writer = csv.writer(f)
- csv_writer.writerow(['job_name', 'job_salary', 'job_address', 'job_exp', 'company_name', 'demand', 'welfare'])
-
- comment = Boss()
- comment.run()

主要功能和流程如下:
定义了一个名为Boss的类,该类用于爬取数据岗位信息并保存到CSV文件中。
在类的构造函数中初始化了一个数据列表self.data_list。
定义了一个名为screen_size的方法,使用tkinter库获取屏幕大小。
定义了一个异步方法main,该方法是程序的主要逻辑。
在main方法中,通过pyppeteer.launch()函数创建一个浏览器实例browser,设置了一些启动参数。
创建一个新页面page,并获取屏幕大小。
使用page.goto()方法打开Boss直聘网站的搜索页面,并等待页面加载。
使用page.evaluateOnNewDocument()方法修改浏览器环境,防止被检测为自动化测试工具。
输入搜索关键词"大数据"并点击搜索按钮。
循环爬取页面数据,每次点击下一页按钮,等待页面加载,解析页面内容并保存到self.data_list中。
限制最多翻页10次。
定义了一个input_time_random方法,生成随机的输入延迟时间。
定义了一个parse_html方法,用于解析页面内容并提取需要的数据,然后将数据保存到CSV文件中。
定义了一个run方法,用于运行异步任务。
在主程序中,先创建一个boss_data.csv文件,并写入表头。
创建一个Boss实例,并调用其run方法来执行爬取任务。
总的来说,这段代码通过模拟浏览器的方式访问Boss直聘网站,搜索关键词"大数据",然后将搜索结果中的数据岗位信息提取出来,并保存到CSV文件中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。