selenium的项目实战详解(单一详情页面处理)

这篇具有很好参考价值的文章主要介绍了selenium的项目实战详解(单一详情页面处理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

看一下任务要求
1. 搜索页输入关键词,点击搜索按钮
2. 列表页内容提取 (正则表达式 + Json)[输入关键字 拿到输入后的第一个页面]
3. 详情页内容提取 (Selenium + XPath)[页面中再点开具体内容 然后显示内容]
4. 保存数据到Excel表

(零)预备环节

(1)先看看要分别引入多少库

from selenium import webdriver   (网页抓取)
from selenium.common.exceptions import TimeoutException  (用于异常排查)
from selenium.webdriver.common.by import By                (用于元素定位)
from selenium.webdriver.support import expected_conditions as EC   (用于显示等待)
from selenium.webdriver.support.wait import WebDriverWait   (用于反屏蔽中设置等待时间)
from os import makedirs    (新建目录的方法)
from os.path import exists  
import json               (处理可能遇到的json文件)
import re                 (编写正则表达式)
import pandas as pd          (编写pandas用dataframe保存到excel)

(2)看看用到哪些全局变量(网址、爬取页数、文件夹名、文件具体名)

INDEX_URL = 'https://www....com/' #网址
TIMEOUT = 10        # 超时10秒
TOTAL_PAGE = 10     # 共爬取10页
RESULTS_DIR = 'results'  # 结果文件夹
RESULTS_FILE = 'jobs.xlsx'#具体文件夹的文件名
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)  # 文件夹不存在就新建  有就放 没有就建

(3)反屏蔽设置[这个以后直接复制粘贴用 不用详细了解]

# 反屏蔽选项设置
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)

browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, TIMEOUT)

browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
#以上是返屏蔽操作 了解

(一)输入关键字 并且点击按钮

先看我自己操作的逻辑

browser.get(INDEX_URL)
inputBox=browser.find_element(By.ID,"kwdselectid") #打开网址后定位到当前文本框
keyword=input("请输入你要搜索的关键字")
inputBox.send_keys(f'{keyword}')            #巧妙 先放一个input 再用f"{}"将变量进行替换
time.sleep(2)
search=wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ush top_wrap']/button")))    #这个存贮方式不是id和class,那么我就用Xhelperl拿到对应的路径
search.click()  #模拟点击操作
wait.until(EC.presence_of_element_located((By.CLASS_NAME,'footer')))  #我们发现仅仅上面那样做是不够的 没有返回值对象,再进行等待
html=browser.page_source   #这个拿到的是下一页的内容源码

(1)对已配置好的brower放置网址

(2)想输入 那就定义对应的文本框 发现id的方法简单,就用了id的搜索

(3)为了更加自由 设置input 放置输入内容

(4)再次是send_keys函数 相当于把你在程序里面的input输送给浏览器 涉及f'{keyword}'又是f和花括号用以变量引用

(5)完事后休息2秒 2秒后再执行下一步点击操作

(6)先获取点击的节点,在进行对应的点击操作,这个时候用了显示等待,为的是能有时间让计算机获取服务器发来的信息

(7)模拟点击命令

(8)这一步就更巧妙 为了确保最后一步能够拿到source 再加一个等待条件:

直到页面底部元素才进行下一步==直到下个页面加载完成 才开始挖掘source内容

如果没有这一步,刚刚点击就要立刻返回数据,可能页面没有跳转,其实也拿不到数据

实际来看,没有这个步骤确实拿不到source

(9)获取一下服务器返回的page_source

PS:下面贴出老师做的版本

# TODO 1. 爬取首页  返回源代码数据    (目的就是在任务栏快速定位代码)
def crawlIndex():
    html=''
    try:
        browser.get(INDEX_URL)
        inputBox=browser.find_element(By.ID,"kwdselectid") #打开网址后定位到当前文本框


    except TimeoutException:
        print("访问超时")

    keyword=input("请输入你要搜索的关键字")
    # keyword='python'
    inputBox.send_keys(f'{keyword}')            #巧妙 先放一个input 再用f"{}"将变量进行替换
    time.sleep(2)

    try:  #在下面尝试搜索功能 这里用显示等待  如果成立就点击完继续执行
        search=wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ush top_wrap']/button")))    #这个存贮方式不是id和class,那么我就用Xhelperl拿到对应的路径
        search.click()  #模拟点击操作

       #这个footer用ctrl+f看一下发现是 页面尾部的内容 一般这个加载出来表示整个页面也加载完成 所以要找这个属性
        wait.until(EC.presence_of_element_located((By.CLASS_NAME,'footer')))  #我们发现仅仅上面那样做是不够的 没有返回值对象,再进行等待
        html=browser.page_source   #这个拿到的是下一页的内容源码

    except TimeoutException:
        print("访问超时")

    #为了方便测试数据解析效果,将获取到的列表页源代码保存在本地文件中
    # with open(f"{RESULTS_DIR}/51job_list.html","w",encoding="utf-8")as f:  #先找到文件夹 再找到目标文件
    #     f.write(html)

    return html

(二)提取我需要的岗位具体内容(工资、地点、要求...)

(1)一般信息会直接分散存放在网页源代码之中,但是这次观察网页源代码发现其实并没有这些信息。但是ctrl+f发现,这些工作岗位集中出现在472行代码之中,那思路就是先提取定位到472行内容,看看是什么情况

jobinfo=re.search('window.__SEARCH_RESULT__ =(.*)</script>',html)      #发现一个问题 输入我们想要的职位 出现在472行代码 window.__SEARCH_RESULT__ = {"top_ads":[],"a...的内容里
#print(jobinfo.group(1)) 

(2)正则提取目标行的内容,发现是一个字典形式的json文件,打印第一个group看看内容,发现内容还是很多,这个时候放在json在线分析网站再整理节点,发现全部保存在“engine_jds”这个分支下面,那就转化为字典,通过键值对的形式分析我们需要的数据。

jobinfo_dict=json.loads(jobinfo.group(1))   #进行类型转换 变成字典形式
jobs=jobinfo_dict['engine_jds']  #既然数据都存在字典里面 那我给你健 你要给我值

(3)下面的处理就变成字典的处理了,没毛病,直接按键取值

   建一个空列表放置对应内容

jobItem = []    # 保存一条工作信息
jobItem.append(job['jobid'])                    # 工作编码      相当于字典的形式 你给我键 我给你值 然后往里面添加
jobItem.append(job['providesalary_text'])       # 工资待遇
jobItem.append(job['workarea_text'])            # 工作地点
if len(job['attribute_text']) == 3:
    jobItem.append(job['attribute_text'][1])    # 标签文本:经验要求
    jobItem.append(job['attribute_text'][2])    # 标签文本:学习要求
elif  len(job['attribute_text']) == 2:
            jobItem.append(job['attribute_text'][1])    # 标签文本:经验要求
            jobItem.append('')
else:
            jobItem.append('')
            jobItem.append('')
jobItem.append(job['job_href'])                 # 详情页链接
jobItem.append(job['company_name'])             # 公司名称
jobItem.append(job['companysize_text'])         # 公司规模
jobItem.append(job['companytype_text'])         # 公司类别
if job['jobwelf']:
            jobItem.append(job['jobwelf'])              # 公司福利
else:
    jobItem.append('')
obItem.append(job['companyind_text'])          # 主营业务
jobItem.append(job['updatedate'])               # 发布日期
jobItem.append(job['company_href'])             # 公司介绍页链接
        # print(len(jobItem))

jobItems.append(jobItem)    # 将1条信息添加到工作信息表中

(四)直接保存一下这个列表页 还是用pd的方法保存,定义保存在二维列表中文章来源地址https://www.toymoban.com/news/detail-448820.html

header=['工作编码', '工作名称', '工资待遇', '工作地点', '经验要求', '学历要求', '详情页链接', '公司名称', '公司规模', '公司类别', '公司福利', '主营业务', '发布日期',
              '公司介绍页链接']
df=pd.DataFrame(data,columns=header)       #定义这个二维列表
df.to_excel(f"{RESULTS_DIR}/{RESULTS_FILE}",index=False,header=header)
#成功 这个时候所有文件都保存到了本地

到了这里,关于selenium的项目实战详解(单一详情页面处理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序商城项目实战(第四篇:商品详情页)

    json里边设置一下页面标题 \\\"navigationBarTitleText\\\": \\\"商品详情\\\" 上方由一个轮播图展示, 中间为商品信息,后台会返回图文详情富文本,前台只需赋值 下方固定一个工具栏 客服 分享 购物车 添加购物车 立即购买 分享是将一个按钮隐藏且将其定位在分享处,客服也是一样的 加入购

    2024年02月09日
    浏览(60)
  • selenium处理登陆爬虫(维持登陆状态请求页面)

    selenium在处理需要登陆的时候,需要修改浏览器请求头参数cookie或token,在请求需要登陆的页面时,添加参数,跳过登陆,直接获取登陆后的内容。 处理思路 浏览器先登陆,请求同一个域名下的网页,抓包,提取浏览器内的cookie字符串,如: 标红的字符串直接复制,并解析为

    2024年02月12日
    浏览(36)
  • selenium对于页面改变的定位元素处理办法

    在学习selenimu中,总是发现元素定位不到,想了各种办法,最后总结大致有两个原因。 1.等待时间不够,页面还没有完全渲染就进行操作,使用time模块进行等待。 2.换了页面后,发现定位不到元素,因为浏览器还停留在最开始的页面,处理办法,加一行代码。 运行结果: 缺

    2024年02月01日
    浏览(47)
  • (九) web自动化测试-selenium处理页面的弹框

    input标签可以直接使用send_keys(file path)上传文件 方法: el = driver.find_element_by_id(‘上传按钮id’) el.send_keys(“文件路径+文件名”) 示例: 打开链接:https://image.baidu.com/ 点击识别上传按钮 点击上传按钮 选择本地照片上传 在页面操作的时候会遇到javascript生成的alert、comfirm和pro

    2023年04月11日
    浏览(59)
  • Python Selenium.WebDriver 最强详解页面加载策略

    在通过Selenium加载一个网页时,Selenium都会等待页面加载完了才会运行下面的代码,这是因为 webdriver.get 方法会阻塞直到网页全部加载完成。 通常如果当页面加载花费大量时间时,可能是加载了很多外部资源「如:图像、css」,又或则是浏览的是国外网站,使用的网络环境差

    2023年04月22日
    浏览(45)
  • 04 python38的scrapy和selenium处理异步加载的动态html页面

    1.4.1 taobao_login.py模拟登陆生成cookies.json 1.4.2 taobao_login_after.py淘宝登陆后测试 修改下载中间件配置 1.6.1 添加数据模型 1.6.2 修改爬虫代码 1.6.3 测试运行爬虫

    2024年02月06日
    浏览(41)
  • Mongodb 多文档聚合操作处理方法(单一聚合)

    聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来: 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作,您可以使用: 聚合管道 单一目的聚合方法 Map-reduce 函数 所有这些操作都会聚合来自单个集合

    2024年02月16日
    浏览(42)
  • 黑马本地生活(列表页面,详情页面)

    🏡浩泽学编程 :个人主页  🔥 推荐专栏 :《深入浅出SpringBoot》《java项目分享》               《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 在学习微信小程序时,黑马给出了列表页面讲解,这里我再补充一个黑马没有讲诉的商家详情页面代码

    2024年01月21日
    浏览(40)
  • 项目实战:编辑页面加载库存信息

    注意下面的 param s    必须要加 s , 如果不加 s ,后端接收不到 fid,Integer.parseInt(req.getParameter(\\\"fid\\\"))会出现java.lang.NumberFormatException:Cannot parse null string。本人当时出现这个错误检查了一个小时,所以很难发现这个小细节,因为逻辑都是对的。  ​​

    2024年02月06日
    浏览(38)
  • Selenium详解附实战地址(一)

    目录 一、自动化测试相关概念 1.1、什么是自动化 1.2、什么项目适合做自动化 1.3、自动化测试用例的设计原则 1.4、Selenium webdriver优点? 1.5、webdriver的环境配置 1.6、关闭chrom更新 二、元素定位简介 三、元素定位常用方法 1、id定位 2、name定位 3、class name定位 4、Tag_name定位 5、

    2024年02月06日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包