Python爬虫实战(7)Selenium拉勾网

房东的猫 提交于 2019-12-15 09:17:07

利用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/ 本科及以上 / 全职
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!