爬取前尘无忧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,一经查实,立即删除!

相关文章

实验八——函数定义及调用总结

1.本次课学习到的知识点&#xff1a; (1)学习了数字金字塔。pyramid ()函数功能&#xff0c;函数定义时&#xff0c;形参n决定数字金字塔的层数&#xff1b; (2)不返回结果的函数定义&#xff1a; (3)复数运算&#xff1a; c1x1&#xff08;y1) i&#xff0c;c2x2&#xff08;y…

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

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

QT pro文件详解

1.QT pro文件配置项说明 注释&#xff1a;注释是从一行的#开始&#xff0c;到这一行的结束。QT &#xff1a;这个是添加QT项目需要的模块的&#xff0c;若项目中要排除某个模块&#xff0c;也可用QT -配置项。TEMPLATE : 这个配置项确定qmake为这个应用程序生成哪种makefile …

可伸缩视频编码svc

可伸缩视频编码&#xff08;Scalable Video Coding, SVC&#xff09;技术把视频信号编码成分层的形式&#xff0c;当带宽不足时只对基本层的码流进行传输和解码&#xff0c;但这时解码的视频质量不高。当带宽慢慢变大时&#xff0c;可以传输和解码增强层的码流来提高视频的解码…

【vim】几种模式的切换

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

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数&#xff1a; 1 public class SeqList<T> extends Object {2 protected int n;3 protected Object[] element;4 5 public SeqList(int length) {6 this.element new Object[length];7 this.n 0…

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

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

Qt学习:QAction系列详解

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

H.264优秀特征

一、主要特性 1、H.264/AVC相对以前的编码方法&#xff0c;以MPEG-2为例&#xff0c;在图像内容预测方面提高编码效率&#xff0c;改善图像质量的主要特点如下&#xff1a; ● 可变块大小运动补偿&#xff1a; 选择运动补偿大小和形状比以前的标准更灵活&#xff0c;最小的…

Linux 文件系统 EXT4 的前世今生

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

windows 添加开始菜单

C:\Users\用户名&#xff08;为你设置的电脑名称&#xff09;\AppData\Roaming\Microsoft\Windows\Start Menu C:\ProgramData\Microsoft\Windows\Start Menu 注&#xff1a;默认状态下AppData和ProgramData文件夹为隐藏状态&#xff0c;所以要查看需要先显示隐藏的文件。 具体…

awesome-go:很全的go语言资源合集

awesome-go:一个很全的go语言框架&#xff0c;库&#xff0c;软件合集 前面发过关于awsone-python, awsone django&#xff0c; flask。最近在学习golang&#xff0c;所以找到awsone-go 非常赞的go语言 Audio & 音乐类安全认证 & OAuthCUI数据库数据库驱动日期时间Emai…

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()":…

C语言的指针初始化特别注意一点

void func2(int *value) { *value 2; /// value为空指针&#xff0c;不能被取值&#xff0c;所以*value是错误的 } void func1() { int *p 0;//此处相当于PNULL func2(p); } / void func2(int *value) { *value 2; /// 正确} void func1() { int a0; int *p &…

小程序—九宫格心形拼图

说明 前几天在朋友圈看到好几次这种图片。 这种图片&#xff0c;是用九张图片拼成的一个心形。 感觉很有趣&#xff0c;就上网查了查怎么做&#xff0c;大部分的说法就是用美图秀秀的拼图功能来做&#xff0c; 在微信小程序中也有专门做心形拼图的小程序&#xff0c;我都试了试…

第二部分:志愿录取标准

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

100. Same Tree

Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value. 递归遍历左子树和右子树 /*** Definition for a binary tree node.* struct T…

关于RTP时间戳及多媒体通信同步的问题/H264关于RTP协议的实现

http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html H264关于RTP协议的实现:http://www.rosoo.net/a/201108/14896.html RTP协议包头的格式&#xff1a; 10~16 Bit为PT域&#xff0c;指的就是负载类型…