任务爬取智联页面的招聘信息并且存入数据库。
由于是初次尝试 这里选择了固定的页面存入数据库。
首先确定需要爬取的页面
http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国
%2B广东&p=###
### 这里填写爬取的页面, 后期在程序里面自己选择。
首先 我们打开页面http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全国
%2B广东&p=1 查看信息,我们选择谷歌浏览器来帮助筛选。如图
我们发现我们需要的东西位置在 newlist 类下面
我们利用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编码还是报错:
最后百度发现问题,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 接下来测试下程序