python + selenium 爬取Boss直聘
from selenium import webdriver
import time
import random
import pandas as pd
启动谷歌浏览器
driver=webdriver.Chrome()
隐式等待(等待页面元素加载完毕)
driver.implicitly_wait(10)
防止被识别, 设置随机等待秒数
rand_seconds = random.choice([1,3])+random.random()
循环10次 代表10页
for i in range(1,11):
time.sleep(rand_seconds)
driver.get(url='/c101010100/?query=python&page=%d'%i)
driver.implicitly_wait(10) #隐式等待
爬取标题的时候遇到了一个小问题,爬出来的标题都是重复的。所以在这强制了爬取目标
for a in range(1,29):
#用来存放全部数据
listall = []
#用来存标题的url
listurl = []
dict = {}
#爬取标题
listName=driver.find_elements_by_xpath('//*[@]/div/div/ul/li[%d]/div/div[1]/h3/a/div[1]'%a)
#爬取标题的url
urls = driver.find_elements_by_xpath('//*[@]/div/div/ul/li[%d]/div/div[1]/h3/a'%a)
# 循环取出标题文本 和 超链接
for j in range(len(listName)):
dict['name']=listName[j].text
dict['url']=urls[j].get_attribute('href')
# 进入每一个详情页 抓取内容
time.sleep(rand_seconds)
driver.get(url=urls[j].get_attribute('href')) #new?
content=driver.find_elements_by_xpath('//*[@]/div[3]/div/div[2]/div[2]/div[1]/div')
# 遍历 取出内容文本
for c in range(len(content)):
关于sub的用法底部有链接
dict['content'] = re.sub('\n|\s|,,,,',',',''.join(content[c].text))
print(dict)
listall.append(dict)
# 在这也遇到了一个小问题,爬取职位描述成功后没有继续跳转 所以用到了() 返回函数
driver.back()
# 将list类型转换为pandas二维数组
data = pd.DataFrame(listall)
# 存csv
data.to_csv('Boss直聘.csv', encoding='utf8', mode='a+',header=None,index=False)
# 完成后关闭浏览器
driver.close()