python3 [爬虫入门实战] 爬虫之使用selenium 爬取百度招聘内容并存mongodb

2023-11-05

爬取的内容为百度招聘页面下的python 杭州地区

所要爬取的内容

这里写图片描述

一共爬取的是6个字段
1 招聘岗位 2 招聘城市 3 招聘公司 4 招聘薪资 5 招聘日期 6 招聘来源网站

用的是selenium + beautifulsoup + mongodb + re 模块进行爬取的内容

总体上难度不是很大,内容清除也不是很完整,记不住的或者没有记牢固的一边百度,一边加深印象。总体来说还是爬取出来了了

问题总结: 不知道是不是多进程结合selenium 爬取是不是不行,然后试着用了,我也不知道里面的原理是怎么回事,这次是自己初次入门,能力还是不足,mongodb使用的时候也不知道为什么开启了服务,但是插入数据老是插不进去,可能是被锁住了,但是删除锁之后还是会出现问题,也不知道后来问题是怎么解决的,也就那样好的吧。


在使用selenium 跳转到下一页的时候,根据get_element_byxpath(xxx) 里面的id 会根据页面的变化而变化的。如下图,可以自己亲测一下

这里写图片描述

总的值有1,2,3 昨晚弄的也是有点急什么的,不过最后爬取出来

看下爬取成果,总共586条,确实对应上了第一张图片上的586,
没有重复度。
这里写图片描述


最后贴上源代码:

# encoding=utf8
import re
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

from bs4 import BeautifulSoup

import pymongo

# 多进程
from multiprocessing import Pool

# 1 打开数据库连接,mongodb默认端口为27017
conn = pymongo.MongoClient(host='localhost',port=27017)
# 2 选择或创建数据库
jobdata = conn['baidujobs']
# 3 选择或创建数据集合
ver_job = jobdata['verjob']

baidu_baseurl = 'http://zhaopin.baidu.com/quanzhi?tid=4139&ie=utf8&oe=utf8&query=python%E6%9D%AD%E5%B7%9E&city_sug=%E6%9D%AD%E5%B7%9E'
def set_winscroll(driver):
    time.sleep(2)
    driver.execute_script('window.scrollBy(0,2000)')
    time.sleep(3)
    driver.execute_script('window.scrollBy(0,3000)')
    time.sleep(3)


# 1 初始化driver
driver = webdriver.PhantomJS()
# 2 调用get方法
driver.get(baidu_baseurl)
# 3 进入网页
set_winscroll(driver)

# 4 获取资源(第一页的数据)
we_data = driver.page_source
# print('first_we_data ' + we_data)


def parse_html(html):
    soup = BeautifulSoup(html, 'lxml')
    item_url = soup.findAll('a', {'class': 'clearfix item line-bottom'})
    # for item in zip(item_url):
    #     print(item.get('href'))

    # 职位信息
    jobs = soup.findAll('div', {'class': 'title-h3 line-clamp1'})
    # for job in jobs:
    # print(job.string) # 职位信息
    # 地址 + 公司名
    compy = soup.findAll('p', {'class': 'area line-clamp1'})
    # for com in compy:
    #     print(com.string)

    # 薪资
    salarys = soup.findAll('p', {'class': 'salary'})
    # for salary in salarys:
    #     print(salary.string)
    # 发布时间跟发布来源网站
    addresss = soup.findAll('div', {'class': 'right time'})
    # print(addresss)
    reg = r'<p>(.*?)</p>'
    regx = re.compile(reg)
    ads = re.findall(regx, str(addresss))
    # print(ads)
    # for adds in ads:
    #     data = adds.split('|')
    #     print(data)
    for itm_url, job_detail, ver_compny, ver_salary, ver_addres in zip(item_url, jobs, compy, salarys, ads):
        data = {
            'itme_url': 'http://zhaopin.baidu.com'+itm_url.get('href'),
            'job_detail': job_detail.string,
            'ver_compny': str(ver_compny.string),
            'ver_salary': ver_salary.string,
            'ver_addres': str(ver_addres).split('|'),
        }
        print(data)
        # 插入数据库
        ver_job.insert_one(data) # 插入数据库失败
        f.write(str(data))


def get_page_source(page_num):
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="pagination"]/p/span/a[%s]' % page_num).click()
    # //*[@id="pagination"]/p/span/a[1]  为在第一页的按钮
    # //*[@id="pagination"]/p/span/a[2]  为第二页的按钮
    set_winscroll(driver)
    we_data = driver.page_source
    return we_data

f = open('百度招聘前30页杭州.txt', 'a',encoding='utf-8')
# 首页的数据
def getBaiduHangZhouJob(we_data):
    parse_html(we_data)
    for i in range(1, 50):
        if i==1:
            we_data = get_page_source(1)
            parse_html(we_data)
        elif i<=5:
            we_data = get_page_source(str(2))
            parse_html(we_data)
        else:
            we_data = get_page_source(str(3))
            parse_html(we_data)
    f.close()


if __name__ == '__main__':
    getBaiduHangZhouJob(we_data)
    # pool = Pool(processes=10)
    # pool.map_async(getBaiduHangZhouJob(we_data))
    # pool.close()
    # f.close()

这里也使用了存入道txt文件中的方法,两个方法都有用到。

这次是第二次自己单独做练习selenium + mongodb

对于分布式爬虫scraper框架,需要进行开始的学习了,一开始对mongodb , selenium 也是有抵触,惧怕心理,不过下来之后却也是差不多的感觉,这次是入门了吧。慢慢的了解,熟悉,练习,回头过来你会发现也就是那么回事,加油

下次, scraper分布式爬虫的练习 ,对于python开发岗位,自己也要学会Django的学习开发,路子还有很长,需要自己静下心来摸索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 [爬虫入门实战] 爬虫之使用selenium 爬取百度招聘内容并存mongodb 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f

随机推荐