爬取智联招聘信息并且存入数据库

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

任务爬取智联页面的招聘信息并且存入数据库。

由于是初次尝试 这里选择了固定的页面存入数据库。


首先确定需要爬取的页面

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国

%2B广东&p=###

### 这里填写爬取的页面, 后期在程序里面自己选择。

 首先 我们打开页面http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国

%2B广东&p=1 查看信息,我们选择谷歌浏览器来帮助筛选。如图

f2902d2bc5795de60991aa2ee1b67685.png

我们发现我们需要的东西位置在 newlist 类下面

679b12f681ae451669dfd81d78f5b3de.png

我们利用BS4 来解析和分析页面。

resp = requests.get(start_yemian_html,headers=headers)

soup = bs(resp.text,"html.parser")

#获取工作地点

place=soup.find_all(attrs={"class":"newlist"})

for i in place:

#工作名称

zwmcold1 = i.find(attrs={"class":"zwmc"}).get_text()

zwmc2 = zwmcold1.replace("\n"," ")

zwmc3 = zwmc2.replace(" ","")


因为这样获取的zwmcold1 有空格和空行所以用replace来替换掉,这样就获得了最后的zwmc3(职位名称)。同样的道理 我们可以这样获取 工作地点,工资水平已经公司名称,

#公司名称

gsmc1 = i.find(attrs={"class":"gsmc"}).get_text()

gsmc = gsmc1.replace("\n"," ")

#职位薪水

zwxz1 = i.find(attrs={"class":"zwyx"}).get_text()

zwxz = zwxz1.replace("\n"," ")

#工作地点


gzdd1 = i.find(attrs={"class":"gzdd"}).get_text()

gzdd = gzdd1.replace("\n"," ")



好了。以上我们已经用最简单的方法抓取了智联的招聘信息,下面我们需要把这些信息放入数据库里面。

我们首先定义一个数据库的方法:

def writetosjk(zwmc3,gsmc,zwxz,gzdd):

#创建数据库链接

conn =pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd="zfno11",db="job",charset='utf8')

        #创建游标

        #for i in range(1,10):

sql = '''insert into job 

                    (jobname,comname,salary,jobplace)  

                values(%s, %s, %s, %s)'''

cursor = conn.cursor()

try:

cursor.execute(sql,(zwmc3,gsmc,zwxz,gzdd))

         #提交,不然无法保存新建或者修改的数据

except MySQLdb.Error: 

 print("数据库执行语句异常")

finally:

conn.commit()

         #关闭游标

cursor.close()

conn.close()

由于我们已经知道了我们需要抓取的信息,以及要存储的信息,所以这里方法的参数已经写死,

zwmc3,gsmc,zwxz,gzdd 到时候我们调用方法,直接传递工资名称,公司名称,职位名称,工作地点。


下面就是完整的代码:

import pymysql

import re

import requests

import urllib

import bs4

from urllib import request

from bs4 import BeautifulSoup as bs


#数据库定义

def writetosjk(zwmc3,gsmc,zwxz,gzdd):

#创建数据库链接

conn =pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd="zfno11",db="job",charset='utf8')

        #创建游标

        #for i in range(1,10):

sql = '''insert into job 

                    (jobname,comname,salary,jobplace)  

                values(%s, %s, %s, %s)'''

cursor = conn.cursor()

try:

cursor.execute(sql,(zwmc3,gsmc,zwxz,gzdd))

         #提交,不然无法保存新建或者修改的数据

except MySQLdb.Error: 

 print("数据库执行语句异常")

finally:

conn.commit()

         #关闭游标

cursor.close()

conn.close()



#第一步,获取页面信息并且保存信息

def get_info_save():

choice=int(input("爬取特定页面或者页面范围爬取 1 特定页面,2指定页面范围"))

if choice == 1:

start_yemian=input("请输入爬去的页数")

start_yemian_html="http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国%2B广东&p="+start_yemian

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"}

resp = requests.get(start_yemian_html,headers=headers)

soup = bs(resp.text,"html.parser")

#获取工作地点

place=soup.find_all(attrs={"class":"newlist"})

# place=soup.find_all(attrs={"class":"newlist_list_content"})

for i in place:

#工作名称

zwmcold1 = i.find(attrs={"class":"zwmc"}).get_text()

zwmc2 = zwmcold1.replace("\n"," ")

zwmc3 = zwmc2.replace(" ","")

#公司名称

gsmc1 = i.find(attrs={"class":"gsmc"}).get_text()

gsmc = gsmc1.replace("\n"," ")

#职位薪水

zwxz1 = i.find(attrs={"class":"zwyx"}).get_text()

zwxz = zwxz1.replace("\n"," ")

#工作地点

gzdd1 = i.find(attrs={"class":"gzdd"}).get_text()

gzdd = gzdd1.replace("\n"," ")

writetosjk(zwmc3,gsmc,zwxz,gzdd)

else:

start_yemian=input("请输入开始爬去的页数")

end_yemian=input("请输入结束爬去的页数")

count=int(start_yemian)

while count<= int(end_yemian):

start_yemian_html="http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国%2B广东&p="+str(count)

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"}

resp = requests.get(start_yemian_html,headers=headers)

soup = bs(resp.text,"html.parser")

#获取工作地点

place=soup.find_all(attrs={"class":"newlist"})

#       place=soup.find_all(attrs={"class":"newlist_list_content"})

for i in place:

#工作名称

zwmcold1 = i.find(attrs={"class":"zwmc"}).get_text()

zwmc2 = zwmcold1.replace("\n"," ")

zwmc3 = zwmc2.replace(" ","")

#公司名称

gsmc1 = i.find(attrs={"class":"gsmc"}).get_text()

gsmc = gsmc1.replace("\n"," ")

#职位薪水

zwxz1 = i.find(attrs={"class":"zwyx"}).get_text()

zwxz = zwxz1.replace("\n"," ")

#工作地点


gzdd1 = i.find(attrs={"class":"gzdd"}).get_text()

gzdd = gzdd1.replace("\n"," ")

writetosjk(zwmc3,gsmc,zwxz,gzdd)

print("第 %s 页爬取完毕并且存入数据库"%(count))

count+=1

 注意可能存在的问题:

我们可以查询到网页页面的编码,一般为UTF-8。 我们把数据存入数据库的时候。,默认的数据库(MYSQL)编码为Latin1,不支持中文。所以要把编码改为UTF-8, 我这边修改了UTF-8编码还是报错:

ebb80beb93c18fcf4d019deca6feccd6.png最后百度发现问题,UTF8暂用3个字节空间。移动设备上有些标签符号。暂用4个字节空间,所以需要把编码改为UTF8MB4


sudo find / -name my.cnf 找到配置文件(使用配置文件修改更快)

在原文中添加以下内容:(mysql和client是原来配置文件里面没有的需要自己手动添加)

[client] default-character-set = utf8mb4 [mysql]default-character-set = utf8mb4 [mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'

最后解决。


OK 接下来测试下程序

fccb9a643f1d16f6a1d4200356d88558.png

392e568a8413b57f420144a0693afe82.png





本文转自 zfno11 51CTO博客,原文链接:http://blog.51cto.com/zfno111/1983420





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
【2月更文挑战第23天】【2月更文挑战第73篇】如何处理爬取到的数据,例如存储到数据库或文件中?
|
1月前
|
XML Java 数据库连接
WebGIS 信息系统-数据库设计
WebGIS 信息系统-数据库设计
41 0
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
356 1
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
165 2
|
8天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
16 1
|
17天前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
29天前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
10 0
|
1月前
|
SQL 存储 数据管理
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
36 1
|
2月前
|
数据库 Android开发 数据库管理
【Android】使用android studio查看内置数据库信息
【Android】使用android studio查看内置数据库信息
74 0
|
4月前
|
存储 SQL 定位技术
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找

热门文章

最新文章