我们首先观察url规律:
https://sou.zhaopin.com/?jl=653&kw=%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&p=1
参数:
jl(joblist):职位总数
kw(keywords):关键词
p(page):第几页
然后,我们只需要在一个循环里,指定p的值,就能访问到所有的页面。
#使用循环,设定 url中 最后一个参数 p 的值
for i in range(1,10):
#访问网页 https://sou.zhaopin.com/?jl=653&kw=%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&p= i
这里,我们选择让程序阻塞在输入处,手动登录后,再输入任意内容继续进行抓取。
#此处暂停一下,等待浏览器打开网页, 手动登录之后, 在输入任意字符,继续执行
input("input any to continue")
职位具体信息,需要鼠标浮动到职位标签上:
同时,使用键盘进行页面滚动(经测试,这种方法最稳定),保证鼠标能浮动到标签上。??
完整代码:
from selenium import webdriver
from selenium.webdriver.common.action_chains import *
from selenium.webdriver.common.keys import Keys
import time
#设置chrome浏览器的驱动程序路径
chrome_path="C:\\Users\\Administrator\\AppData\\Local\\google\\Chrome\\Application\\chromedriver.exe"
#使用chromedriver 创建一个浏览器对象
browser = webdriver.Chrome(chrome_path)
#使用浏览器对象打开网址,其中,网址的参数是 经过了 编码转化的,其实是 jl=653&kw=数据可视化&p=1. p=1 表示 第一页,jl=653 表示有 653 个结果
#这个url是,通过手动访问 智联招聘 网址 观察出来的
browser.get('https://sou.zhaopin.com/?jl=653&kw=%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&p=1')
#此处暂停一下,等待浏览器打开网页, 手动登录之后, 在输入任意字符,继续执行
input("input any to continue")
#打开记录 爬取数据的文件
f = open("data.txt","w",encoding="utf-8")
#使用循环,设定 url中 最后一个参数 p 的值,来爬取多个页面,这里爬取 1-9页,第0页已经打开了
for i in range(1,10):
try:
#等待页面加载,睡眠3s
time.sleep(3)
#拿到body 标签
body = browser.find_element_by_tag_name("body")
#拿到职位div,鼠标浮动在上面会显示 职位 要求 等信息,这是我们需要的
showList = browser.find_elements_by_class_name("iteminfo__line1__jobname__name")
# 这个div 中会 存储 具体的职位信息,很多,所以是个数组
joblist = browser.find_elements_by_xpath("//div[@class='positionlist']/div[@class='joblist-box__item clearfix']")
#遍历 职位div 和职位信息
for i in range(len(joblist)):
info = []
it=showList[i]
job=joblist[i]
# 滚动网页,通过按 键盘的 下建, 按3次
body.send_keys(Keys.DOWN)
body.send_keys(Keys.DOWN)
body.send_keys(Keys.DOWN)
time.sleep(0.5)
# 将鼠标浮动到 标签上, 让职位信息 显示出来
ActionChains(browser).move_to_element(it).perform()
#记录下职位名称
info.append(it.text)
time.sleep(1)
#获取到 职位信息,它们都在 <p>标签里
info_detail = job.find_element_by_xpath(".//div[@class='info-detail']")
info_detail_content = info_detail.find_element_by_xpath(".//div[@class='info-detail__content']/div[@class='info-detail__content-text']")
plst = info_detail_content.find_elements_by_xpath(".//p")
time.sleep(0.5)
#循环将它们记下来
ilst = []
for p in plst:
ilst.append(p.text)
info.append(ilst)
print(info)
#写到文件中
if ilst:
f.write(str(info)+"\n")
f.flush()
#进行下一个网页的抓取
browser.get('https://sou.zhaopin.com/?jl=653&kw=%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96&p='+str(i))
except Exception as e:
print(e)
break
f.close()
|