爬取前尘无忧python职位信息并保存到mongo数据库

1.re实现

 1 import re,os
 2 import requests
 3 from requests.exceptions import RequestException
 4 
 5 MAX_PAGE = 10 #最大页数
 6 KEYWORD = 'python'
 7 headers = {
 8     'User-Agent':
 9         'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
10 }
11 file_name = 're_job51_python.txt'
12 
13 # 获取网页源码
14 def getHtml(page):
15     try:
16         url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{0},2,{1}.html?'.format(KEYWORD,page)
17         response = requests.get(url,headers=headers)
18         response.encoding = response.apparent_encoding
19         return response.text
20     except RequestException:
21         print('请求出错')
22         return None
23 
24 # 解析网页源码,得到目标信息
25 def getTarget(html):
26     reg = re.compile(
27         r'class="t1 ">.*? <a target="_blank" '
28         'title="(.*?)".*? <span class="t2"><a target="_blank" '
29         'title="(.*?)".*?<span '
30         'class="t3">(.*?)</span>.*?<span '
31         'class="t4">(.*?)</span>.*? <span '
32         'class="t5">(.*?)</span>',
33         re.S)  # 匹配换行符
34     target = re.findall(reg,html)
35     return target
36 
37 
38 # 保存到文本中
39 def save_to_txt(item):
40     with open(file_name,'a',newline='') as f:  # newline参数防止两行之间有空行
41         for i in range(len(item)):
42             # 最后一个元素换行,非最后则以','隔开
43             if i == len(item)-1:
44                 f.write(item[i])
45                 f.write('\n')
46             else:
47                 f.write(item[i]+',')
48 
49 def main():
50     # 每次执行前检查文件是否存在,存在则删除
51     if os.path.exists(file_name):
52         os.remove(file_name)
53 
54     # 分页爬取
55     for page in range(MAX_PAGE+1):
56         html = getHtml(page)
57         content = getTarget(html)
58         for item in content:
59             save_to_txt(item)
60 
61 if __name__ == '__main__':
62     main()
View Code

 2.xpath实现

  1 import os
  2 import requests
  3 from requests.exceptions import RequestException
  4 from lxml import etree
  5 import pymongo
  6 from spiders.前程无忧.mongo_config import *
  7 
  8 # mongo数据库设置
  9 client = pymongo.MongoClient(MONGO_URL)
 10 db = client[MONGO_DB]
 11 
 12 MAX_PAGE = 5
 13 KEYWORD = 'python'
 14 headers = {
 15     'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '\
 16     'Chrome/63.0.3239.132 Safari/537.36'
 17 }
 18 file_name = 'xpath_job51_python.txt'
 19 
 20 # 获取网页
 21 def get_html(page):
 22     try:
 23         url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{},2,{}.html?'.format(KEYWORD,page)
 24         response = requests.get(url,headers=headers)
 25         response.encoding = response.apparent_encoding
 26         return response.text
 27     except RequestException:
 28         return None
 29 
 30 # 解析网页
 31 def parse_html(html):
 32     # 构造xpath解析对象,可自动修整HTML文本
 33     html = etree.HTML(html)
 34     # 获取文本 /text()
 35     # 获取属性 /@href
 36     # 获取第i个标签 /tar_name[i]  从1开始
 37     # normalize-space-->去空格换行符
 38     # position_name = html.xpath('normalize-space(//div[@class="el"]/p/span/a/text())')
 39 
 40     # 职位名称,
 41     position_names = []
 42     for name in html.xpath('//div[@class="el"]/p/span/a/text()'):
 43         position_name = name.strip()
 44         position_names.append(position_name)
 45 
 46     # 职位地址
 47     position_urls = html.xpath('//div[@class="el"]/p/span/a/@href')
 48 
 49     # 公司名称
 50     company_names = html.xpath('//div[@class="el"]/span[1]/a/text()')
 51 
 52     # 公司地址
 53     company_urls = html.xpath('//div[@class="el"]/span[1]/a/@href')
 54 
 55     # 位置
 56     locations = html.xpath('//div[@class="el"]/span[@class="t3"]/text()')
 57 
 58     # 薪资
 59     salarys = html.xpath('//div[@class="el"]/span[@class="t4"]/text()')
 60 
 61     # 发布时间
 62     release_dates = html.xpath('//div[@class="el"]/span[4]/text()')
 63 
 64     result = zip(position_names,position_urls,company_names,company_urls,locations,salarys,release_dates)
 65     return result
 66 
 67 
 68 def save_to_txt(element):
 69     with open(file_name,'a',newline='') as f:
 70         for i in range(len(element)):
 71             # data = ','.join(element[i])
 72             if i == len(element)-1:
 73                 f.write(element[i])
 74                 f.write('\n')
 75             else:
 76                 f.write(element[i]+',')
 77 
 78 
 79 def save_to_mongo(element):
 80     keys = ['position_name','position_url','company_name',
 81             'company_url','location','salary','release_date']
 82     result = dict(zip(keys,list(element)))
 83     if db[MONGO_TABLE_XPATH].insert(result):
 84         print('数据成功存储到mongo数据库中')
 85         return True
 86     return False
 87 
 88     # 遍历字典元素
 89     # for k,v in result.items():
 90     #     print(k,':',v)
 91     for key in result:
 92         print(key,':',result[key])
 93 
 94 
 95 
 96 def main():
 97     if os.path.exists(file_name):
 98         os.remove(file_name)
 99     for page in range(1,MAX_PAGE+1):
100         html = get_html(page)
101         elements = parse_html(html)
102         if elements:
103             for element in elements:
104                 save_to_txt(element)
105                 save_to_mongo(element)
106 
107 if __name__ == '__main__':
108     main()
View Code

 



转载于:https://www.cnblogs.com/ray-mmss/p/9373742.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache JMeter 记一次使用HTTP工具POST提交JSON数据进行送积分高并发压测(二)

一、前言 前面文章已经介绍Apache JMeter的基本概率和如果使用&#xff0c;但作为一个开发人员&#xff0c;自己写的代码都应该要好好的COD EREVIEW,好好的自测吧。但是有些场景比如高并发、负载和性能测试的时候&#xff0c;不借助工具是不好进行测试的。Jmter工具设计之初是用…

【vim】几种模式的切换

很多初学者启动vim后&#xff0c;不知道怎么输入字符&#xff1a;按了半天字母&#xff0c;结果屏幕还是空的。 vim和记事本或WORD不一样&#xff0c;不是一打开后就可以输入文字&#xff0c;此时它处于正常模式。 vim一共有4个模式&#xff1a; 正常模式 (Normal-mode) 插入模…

SSH初体验系列--Hibernate--1--环境配置及demo

最近在学hibernate,常见的教程都是搭配mysql,因为公司本地电脑用的是pg,所以就尝试着做个pg的小demo. 自己也是边学边写&#xff0c;只当是加深印象.话不多说&#xff0c;直接开始; 一) 准备工作; 1) 本地安装postgresql ,这个不多说&#xff0c;自己去网上下载; 注: 本次使用的…

Qt学习:QAction系列详解

一、QAction类详解 【详细描述】 QAction类提供了抽象的用户界面action&#xff0c;这些action可以被放置在窗口部件中。 应用程序可以通过菜单&#xff0c;工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行&#xff0c;而不管命令所使用的…

Linux 文件系统 EXT4 的前世今生

在先前关于Linux文件系统的文章中&#xff0c;我写了一份说明书去介绍Linux文件系统&#xff0c;里面有一些高级的概念&#xff0c;比如说&#xff0c;一切都是文件。我很想去深入地讨论更多EXT文件系统的特性的信息。所以&#xff0c;首先让我们来回答这个问题&#xff1a;什么…

zabbix监控系列(5)之通过trap模式监控网络设备

转载于:https://www.cnblogs.com/liaojiafa/p/7216749.html

struts2框架下的一个简单的ajax例子

举个例子 jsp页面&#xff1a; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":…

第二部分:志愿录取标准

第二部分&#xff1a;志愿录取标准 零、概况一、传统志愿录取过程二、平行志愿录取过程三、17年志愿录取过程 零、概况自1977年&#xff0c;恢复高考以来&#xff0c;高考录取标准&#xff0c;作为公平线&#xff0c;都是相当透明的。这部分分享&#xff0c;以录取标准&#xf…

程序员懂点经济学-股票投资

2019独角兽企业重金招聘Python工程师标准>>> ▍写在前面 前面有文章 关于程序员如何赚点小钱 讲过 合理的投资理财&#xff0c;可以了解一下. 再次建议&#xff0c;不要将全身家当投入股市&#xff0c;建议投入10~30%就好了. (不要拿输不起的钱来炒股&#xff0c;比…

彻底弄懂响应式设计中的em和rem

前一阵子在响应式开发中遇到了em和rem的问题&#xff0c;也上网搜过一些文章&#xff0c;篇幅很长&#xff0c;也没有仔细看&#xff0c;今天来总结一下。 rem是指&#xff1a;根元素&#xff08;root element&#xff0c;html&#xff09;的字体大小&#xff0c; em是指&#…

JAVA字符串

字符串 1. 字符串 1.1 字符串概述和特点 java.lang.String类代表字符串。 API当中说&#xff1a;Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作为此类的实例实现。 其实就是说&#xff1a;程序当中所有的双引号字符串&#xff0c;都是String类…

21分钟 MySQL 入门教程

转自 21分钟 MySQL 入门教程 一、MySQL的相关概念介绍二、Windows下MySQL的配置配置步骤MySQL服务的启动、停止与卸载三、MySQL脚本的基本组成四、MySQL中的数据类型五、使用MySQL数据库登录到MySQL创建一个数据库选择所要操作的数据库创建数据库表六、操作MySQL数据库向表中插…

node-sass报错解决方法

node-sass报错解决方法 node-sass报错解决方法 在Vue.js中&#xff0c;每一个vue文件都是一个组件&#xff0c;在.vue文件中可以将模板&#xff0c;脚本&#xff0c;样式写在一起&#xff0c;便于组织整个组件。在使用template&#xff0c;script时&#xff0c;编写css样式时&a…

Visual Studio for Mac Preview离线下载安装

Visual Studio for Mac离线下载安装。 环境&#xff1a;OS X EI Caption 10.11.2 .NET Core SDK 1.1 需预先安装 .NET Core 1.1 SDK macOS版下载地址:https://go.microsoft.com/fwlink/?LinkID835011 安装SDK需先安装openssl。 brew update brew install openssl mkdir -p /us…

LOAM_velodyne学习(一)

在研读了论文及开源代码后&#xff0c;对LOAM的一些理解做一个整理。 文章&#xff1a;Low-drift and real-time lidar odometry and mapping 开源代码&#xff1a;https://github.com/daobilige-su/loam_velodyne 系统概述 LOAM的整体思想就是将复杂的SLAM问题分为&#x…

实战Vue简易项目(2)定制开发环境

本章内容包含上一章思考的解决&#xff0c;还有一些其它的定制... CSS预处理 关于对.vue文件模块处理规则的配置依次可在build/webpack.base.conf.js->build/vue-loader.conf.js->build/utils.js文件中跟踪&#xff1b; 而loaders的关键在于build/vue-loader.conf.js文件…

[POI2007]POW-The Flood

题目描述 给定一张地势图&#xff0c;所有的点都被水淹没&#xff0c;现在有一些关键点&#xff0c;要求放最少的水泵使所有关键点的水都被抽干 输入输出格式 输入格式&#xff1a; In the first line of the standard input there are two integers and , separated by a sin…

LOAM_velodyne学习(二)

LaserOdometry 这一模块&#xff08;节点&#xff09;主要功能是&#xff1a;进行点云数据配准&#xff0c;完成运动估计 利用ScanRegistration中提取到的特征点&#xff0c;建立相邻时间点云数据之间的关联&#xff0c;由此推断lidar的运动。我们依旧从主函数开始&#xff1…

户外穿越

晚上很早就睡了&#xff0c;并且&#xff0c;太过激动&#xff0c;所以早上四点五十分就被惊醒&#xff0c;然后到早上闹钟响。 早上匆匆忙吃过早餐&#xff0c;就赶去坐车&#xff0c;到登山之前&#xff0c;坐了大巴车&#xff0c;又坐了景区的车&#xff0c;景区的路是山路十…

【oracle】关于创建表时用default指定默认值的坑

刚开始学create table的时候没注意&#xff0c;学到后面发现可以指定默认值。于是写了如下语句&#xff1a; 当我查询的时候发现&#xff0c;查出来的结果是这样的。。 很纳闷有没有&#xff0c;我明明指定默认值了呀&#xff0c;为什么创建出来的表还是空的呢&#xff1f;又跑…