1.re实现

 import re,os
import requests
from requests.exceptions import RequestException MAX_PAGE = 10 #最大页数
KEYWORD = 'python'
headers = {
'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
file_name = 're_job51_python.txt' # 获取网页源码
def getHtml(page):
try:
url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{0},2,{1}.html?'.format(KEYWORD,page)
response = requests.get(url,headers=headers)
response.encoding = response.apparent_encoding
return response.text
except RequestException:
print('请求出错')
return None # 解析网页源码,得到目标信息
def getTarget(html):
reg = re.compile(
r'class="t1 ">.*? <a target="_blank" '
'title="(.*?)".*? <span class="t2"><a target="_blank" '
'title="(.*?)".*?<span '
'class="t3">(.*?)</span>.*?<span '
'class="t4">(.*?)</span>.*? <span '
'class="t5">(.*?)</span>',
re.S) # 匹配换行符
target = re.findall(reg,html)
return target # 保存到文本中
def save_to_txt(item):
with open(file_name,'a',newline='') as f: # newline参数防止两行之间有空行
for i in range(len(item)):
# 最后一个元素换行,非最后则以','隔开
if i == len(item)-1:
f.write(item[i])
f.write('\n')
else:
f.write(item[i]+',') def main():
# 每次执行前检查文件是否存在,存在则删除
if os.path.exists(file_name):
os.remove(file_name) # 分页爬取
for page in range(MAX_PAGE+1):
html = getHtml(page)
content = getTarget(html)
for item in content:
save_to_txt(item) if __name__ == '__main__':
main()

2.xpath实现

 import os
import requests
from requests.exceptions import RequestException
from lxml import etree
import pymongo
from spiders.前程无忧.mongo_config import * # mongo数据库设置
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB] MAX_PAGE = 5
KEYWORD = 'python'
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '\
'Chrome/63.0.3239.132 Safari/537.36'
}
file_name = 'xpath_job51_python.txt' # 获取网页
def get_html(page):
try:
url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{},2,{}.html?'.format(KEYWORD,page)
response = requests.get(url,headers=headers)
response.encoding = response.apparent_encoding
return response.text
except RequestException:
return None # 解析网页
def parse_html(html):
# 构造xpath解析对象,可自动修整HTML文本
html = etree.HTML(html)
# 获取文本 /text()
# 获取属性 /@href
# 获取第i个标签 /tar_name[i] 从1开始
# normalize-space-->去空格换行符
# position_name = html.xpath('normalize-space(//div[@class="el"]/p/span/a/text())') # 职位名称,
position_names = []
for name in html.xpath('//div[@class="el"]/p/span/a/text()'):
position_name = name.strip()
position_names.append(position_name) # 职位地址
position_urls = html.xpath('//div[@class="el"]/p/span/a/@href') # 公司名称
company_names = html.xpath('//div[@class="el"]/span[1]/a/text()') # 公司地址
company_urls = html.xpath('//div[@class="el"]/span[1]/a/@href') # 位置
locations = html.xpath('//div[@class="el"]/span[@class="t3"]/text()') # 薪资
salarys = html.xpath('//div[@class="el"]/span[@class="t4"]/text()') # 发布时间
release_dates = html.xpath('//div[@class="el"]/span[4]/text()') result = zip(position_names,position_urls,company_names,company_urls,locations,salarys,release_dates)
return result def save_to_txt(element):
with open(file_name,'a',newline='') as f:
for i in range(len(element)):
# data = ','.join(element[i])
if i == len(element)-1:
f.write(element[i])
f.write('\n')
else:
f.write(element[i]+',') def save_to_mongo(element):
keys = ['position_name','position_url','company_name',
'company_url','location','salary','release_date']
result = dict(zip(keys,list(element)))
if db[MONGO_TABLE_XPATH].insert(result):
print('数据成功存储到mongo数据库中')
return True
return False # 遍历字典元素
# for k,v in result.items():
# print(k,':',v)
for key in result:
print(key,':',result[key]) def main():
if os.path.exists(file_name):
os.remove(file_name)
for page in range(1,MAX_PAGE+1):
html = get_html(page)
elements = parse_html(html)
if elements:
for element in elements:
save_to_txt(element)
save_to_mongo(element) if __name__ == '__main__':
main()
												

爬取前尘无忧python职位信息并保存到mongo数据库的更多相关文章

  1. python爬取当当网的书籍信息并保存到csv文件

    python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...

  2. 爬取网贷之家平台数据保存到mysql数据库

    # coding utf-8 import requests import json import datetime import pymysql user_agent = 'User-Agent: ...

  3. Python scrapy爬虫数据保存到MySQL数据库

    除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...

  4. python爬取智联招聘职位信息(多进程)

    测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点.我们把脚本改进下,采用多进程. 首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量 ...

  5. python爬取智联招聘职位信息(单进程)

    我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...

  6. 爬取拉勾网所有python职位并保存到excel表格 对象方式

    # 1.把之间案例,使用bs4,正则,xpath,进行数据提取. # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json ...

  7. scrapy 第一个案例(爬取腾讯招聘职位信息)

    import scrapy import json class TzcSpider(scrapy.Spider): # spider的名字,唯一 name = 'tzc' # 起始地址 start_u ...

  8. 简单抓取安居客房产数据,并保存到Oracle数据库

    思路和上一篇差不多,先获取网站html文件,使用BeautifulSoup进行解析,将对应属性取出,逐一处理,最后把整理出的记录保存到oracle中,持久化储存. '''Created on 2017 ...

  9. 多线程爬取猫眼电影TOP100并保存到mongo数据库中

    import requests import re import json from requests.exceptions import RequestException from multipro ...

随机推荐

  1. Win10 彻底关闭 Windows Defender

    1.使用快捷键 WIN+R 调出运行工具,然后再输入组策略命令 gpedit.msc 再点击确定. 2.进入组策略在计算机配置下面的管理模板,Windows 组件就可以看到 Windows Defen ...

  2. 【Docker】:docker安装ELK(logstash,elasticsearch,kibana)

    一:安装logstash 1.拉取镜像 docker pull logstash:5.6.11 2.创建目录 mkdir /docker/logstash cd /docker/logstash 3. ...

  3. C++:链表(有头链表)

    介绍 把链表分为无头链表和有头链表. 无头链表:所有的节点都包含了有效数据,上一篇文章中演示代码使用的就是无头链表. 有头链表:用一个固定的头节点来指代整个链表,所有的对象都挂在这个头节点下面,而头节 ...

  4. python学习-24 局部变量与全局变量

    局部变量与全局变量 1.没有缩进的变量,为全局变量 name = 'jphn' 在子程序里定义的变量,局部变量 2. name = 'jphn' #全局变量 def a(): name='andy' ...

  5. python笔记006-文件操作

    1文件操作... 1 1.1打开和关闭文件... 1 1.1.2 open函数... 1 1.2 文件 File对象的属性... 1 1.2.1 属性... 1 1.2.2 方法... 2 1.2.3 ...

  6. matplotlib笔记1

    散点图-scatter 散点图显示两组数据的值,每个点的坐标位置由变量的值决定由一组不连接的点完成,用于观察两种变量的相关 import numpy as np import matplotlib.p ...

  7. css 学习笔记 常用到的知识

    做 loading 居中 剧中通常就是 top left 50% 再调一下自己就可以了 关键是要有 width height 遇到一些base on content 决定 height 的情况一般上有 ...

  8. Angularjs 中 ng-repeat 循环绑定事件

    用ng-repeat循环是如果有ng-click之类的事件需要传入参数我们一般这样写 <span class='del' ng-click="RemoveCost({{item.Id} ...

  9. 关于Vue中页面(父组件)下拉,页面中的子组件加载更多数据的实现方法

    一个项目中存在很多这种情况:父组件(页面)中的子组件需要做下拉加载更多的需求,但是这个下拉到底部的动作只能通过监控页面(父组件)来完成 这就需要父子组件之间的通信,代码如下: 1. 建立一个用于父子组 ...

  10. javascript新特性

    让我们看看javascript中的一些新特性.本文将介绍它们的语法和相关链接,以帮助读者及时了解它们的进展.我们将通过编写一个小测试项目来演示如何快速使用这些新功能! 关于提案 提案分为五个阶段.有关 ...