使用selenium库,看了其他各种文章,都说利用classname来定位是find_elements_by_class_name函数。但是我这么实现后:content=driver.find_elements_by_class_name('positionItem-title-text'),发现运行时报错:DeprecationWarning: find_elements_by_class_name is deprecated. Please use find_elements(by=By.CLASS_NAME, value=name) instead
意思是新版的Python已经不支持这个函数了,需要改成find_elements(by=By.CLASS_NAME, value=name)改成这种形式
于是我改成content = driver.find_elements(by=CLASS_NAME, value='positionItem-title-text')
结果还是报错:name 'CLASS_NAME' is not defined.
最终发现find_elements最正确的形式是:content = driver.find_elements(By.CLASS_NAME,'positionItem-title-text')。
如果此时还报错:name 'By' is not defined。需要在一开始声明导入下By。加上这一句就OK啦
from selenium.webdriver.common.by import By.
总结,Python3里,find_elements函数的正确用法:
driver.find_elements(by=By.CLASS_NAME, value='name')或
driver.find_elements(By.CLASS_NAME, 'name')
如果不是class_name,直接换成即可以下对应的即可f'f
#通过元素id定位()
driver.find_element(by.id,'kw')
#通过元素name定位
driver.find_element(by.name,'wd')
#通过类名进行定位
driver.find_element(by.class_name,'s_ipt')
#通过标签定位
driver.find_element(by.tag_name,'input')
#通过xpath表达式定位
driver.find_element(by.xpath,'//*[@id="kw"]')
#通过css选择器进行定位
driver.find_element(by.css_selector,'#kw')
#通过完整超链接定位
driver.find_element(by.link_text,'新闻')
#通过部分链接定位
driver.find_element(by.partial_link_text,'hao')
driver.close()#关闭浏览器
再放个循环抓取字节的pm招聘title的源码。
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
#利用selenium抓取数据
driver= webdriver.Chrome()
final_list=[]
#针对网页列表网址特性,构建循环抓全部的列表网址
for i in range(1,60):
url = 'https://jobs.bytedance.com/experienced/position?keywords=&category=6704215864591255820&location=CT_11&project=&type=&job_hot_flag=¤t={}&limit=10&functionCategory='.format(i)
driver.get(url)
time.sleep(3)
content = driver.find_elements(By.CLASS_NAME,'positionItem-title-text')
for i in content:
final_list.append(i.text)
print(i.text)
#全部抓完之后再关闭浏览器,如果放在循环里,抓一次就关闭浏览器,第二次抓的时候就会报错啦。
driver.close()
#将抓取到的title写入文件
for i in final_list:
with open('zijie_job.txt','w+') as f:
f.write(i)
f.write('\n')