Python爬虫实战(7)Selenium+拉勾网
利用selenium和BeautifulSoup库爬取拉勾网的职位信息。
运行平台: Windows
Python版本: Python 3.8
IDE: Pycharm
基本思路:打开网页在输入框输入搜索信息,再点击搜索,在网页源码中得到各个职位信息的href。再利用各个href打开职位信息的详情页,爬取信息。
网页分析
首页
打开首页会跳出切换城市的界面,找到关闭界面的id,点击关闭它。
然后依次找到输入框,输入内容,再点击搜索。
列表页
各个职位的href都放在class=“position_link” 这个标签中。找到这些职位的href即可。
详情页
职位的名称在class=“name” 中,其他信息在class=“job_request” 的各个span标签下。
代码
# 利用selenium爬取拉勾网信息
import time
from selenium import webdriver
from bs4 import BeautifulSoup
class Lagou_spider(object):
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
def __init__(self):
self.driver = webdriver.Chrome(executable_path=self.driver_path)
self.url = 'https://www.lagou.com/'
def run(self):
self.driver.get(self.url)
# 关闭首页的切换城市选择
inputTag = self.driver.find_element_by_id('cboxClose')
inputTag.click()
time.sleep(1)
# 在输入框输入内容,并点击搜索
inputTag = self.driver.find_element_by_id('search_input')
inputTag.send_keys('huawei')
time.sleep(1)
inputTag = self.driver.find_element_by_id('search_button')
inputTag.click()
# 得到网页源码
while True:
source = self.driver.page_source
self.parser_lists_page(source)
# 判断还有没有下一页
if self.driver.page_source.find('pager_next pager_next_disabled') != -1:
break
else:
self.driver.execute_script("window.scrollBy(0,3000)")
time.sleep(1)
next_Btn = self.driver.find_elements_by_class_name('pager_next')[1]
next_Btn.click()
time.sleep(1)
print('\n爬取结束!')
# 解析列表得到每个职位的url
def parser_lists_page(self, source):
html = BeautifulSoup(source, 'html.parser')
items = html.find_all('a', class_='position_link')
for item in items:
time.sleep(1)
position_url = item['href']
self.request_detail_page(position_url)
# 解析具体每个职位的信息
def request_detail_page(self, url):
self.driver.execute_script("window.open('%s')" % url)
self.driver.switch_to.window(self.driver.window_handles[1])
source = self.driver.page_source
html = BeautifulSoup(source, 'html.parser')
# 获取职位要求
position_name = html.find('h1', class_='name').get_text()
job_request = html.find('dd', class_='job_request')
position_salary = job_request.find_all('span')[0].string
position_place = job_request.find_all('span')[1].string
position_experiment = job_request.find_all('span')[2].string
position_education = job_request.find_all('span')[3].string
position_worktime = job_request.find_all('span')[4].string
print('{name:<{len}}\t'.format(name=position_name,
len=22 - len(position_name.encode('GBK')) + len(position_name)), end='')
print(position_salary, position_place, position_experiment, position_education, position_worktime)
time.sleep(1)
self.driver.close()
self.driver.switch_to.window(self.driver.window_handles[0])
if __name__ == '__main__':
Spider = Lagou_spider()
Spider.run()
注意事项
0.关闭完切换城市后不能马上输入
刚关完切换城市的界面,直接找输入框的时候会报错要延时一下 。
inputTag = self.driver.find_element_by_id('cboxClose')
inputTag.click()
time.sleep(1)
1.是否还有下一页的判断
可以在最后的一页的网页源码中,看那个class是否存在。
if self.driver.page_source.find('pager_next pager_next_disabled') != -1:
break
还有点击下一页时,class内的名称是 pager_next 后面带有空格,用find_element_by_class_name直接查找会报错。一般有空格是代表这个类名可能有多个,用find_elements_by_class_name再定位是哪个。
2.模拟打开新网页时,网页的输入
self.driver.execute_script("window.open('%s')" % url)
用这种方式传入网址。
3.文本的对齐
文本对齐的方法,是参考这篇博客的内容 python str.format与制表符\t关于中文对齐的细节问题https://blog.csdn.net/Excaliburrr/article/details/76794451
输出结果
这个只是其中一部分的数据,没有全部都贴上来!
高级软件工程师 20k-40k /深圳 / 经验5-10年 / 学历不限 / 全职
高级java 16k-32k /深圳 / 经验3-5年 / 本科及以上 / 全职
Java开发工程师 15k-30k /武汉 / 经验5-10年 / 本科及以上 / 全职
软件测试工程师 13k-26k /武汉 / 经验1-3年 / 本科及以上 / 全职
通用软件工程师 15k-30k /西安 / 经验3-5年 / 本科及以上 / 全职
AI算法工程师 20k-40k /武汉 / 经验3-5年 / 本科及以上 / 全职
c++开发工程师 13k-25k /武汉 / 经验1-3年 / 本科及以上 / 全职
Java开发工程师 15k-30k /武汉 / 经验3-5年 / 本科及以上 / 全职
C开发工程师 15k-25k /武汉 / 经验1-3年 / 本科及以上 / 全职
Java开发工程师 12k-24k /长沙 / 经验1-3年 / 本科及以上 / 全职
c++开发工程师 12k-24k /长沙 / 经验1-3年 / 本科及以上 / 全职
驱动开发工程师 15k-30k /武汉 / 经验3-5年 / 本科及以上 / 全职
应用开发工程师 15k-30k /武汉 / 经验3-5年 / 本科及以上 / 全职
软件开发工程师 30k-60k /北京 / 经验不限 / 本科及以上 / 全职
C/C++高级开发工程师 18k-36k /杭州 / 经验5-10年 / 本科及以上 / 全职
高级软件工程师 15k-30k /杭州 / 经验3-5年 / 本科及以上 / 全职
Java开发工程师 15k-30k /杭州 / 经验5-10年 / 本科及以上 / 全职
前端开发工程师 20k-40k /武汉 / 经验3-5年 / 本科及以上 / 全职
golang开发工程师 20k-40k /深圳 / 经验3-5年 / 本科及以上 / 全职
Java开发工程师 20k-40k /深圳 / 经验5-10年 / 本科及以上 / 全职
软件开发工程师 25k-50k /东莞 / 经验不限 / 本科及以上 / 全职
软件开发工程师(后端) 15k-30k /深圳 / 经验不限 / 本科及以上 / 全职
终端系统应用开发工程师 16k-30k /西安 / 经验3-5年 / 本科及以上 / 全职
大数据工程师 13k-25k /西安 / 经验5-10年 / 本科及以上 / 全职
高级软件工程师 14k-25k /西安 / 经验3-5年 / 本科及以上 / 全职
高级java开发工程师 13k-20k /西安 / 经验1-3年 / 本科及以上 / 全职
云服务Java开发工程师 25k-50k /深圳 / 经验3-5年 / 本科及以上 / 全职
C/C++软件开发工程师 13k-25k /深圳 / 经验1-3年 / 本科及以上 / 全职
备件计划专员 8k-13k /深圳 / 经验1-3年 / 本科及以上 / 全职
IT项目管理(流程变革) 8k-13k /深圳 / 经验1-3年 / 本科及以上 / 全职
变革与IT专员(业务运营分析... 8k-13k /深圳 / 经验1-3年 / 本科及以上 / 全职
运营分析专员 8k-13k /深圳 / 经验1-3年 / 本科及以上 / 全职
来源:CSDN
作者:Zlzzz.
链接:https://blog.csdn.net/qq_37571708/article/details/103456051