爬取前程无忧招聘网站十万条招聘信息并存入数据库
1.首先导入本次需要用到的包
import json #网页可能使用json写的数据
import re ? #正则表达式
import pymysql #导入mysql等下需要连接数据库存储爬虫数据
import requests #导入请求包,获取网页
from bs4 import BeautifulSoup #网页源码解析器
2.进行爬虫
#数据库存储的操作可以在爬虫之后进行(可先看第二部分爬虫)
cur = pymysql.connect(user='',
? ? ? ? ? ? ? ? ? ? ?password="",
? ? ? ? ? ? ? ? ? ? ?host='',
? ? ? ? ? ? ? ? ? ? ?database='')
#连接数据库,ctrl+p可以查看需要的参数。
?
def save(update_time, positon_name, salary, job, company_type, company_name, company_size, attribute, workarea):#定义一个save函数传入所需参数
? ?cursor = cur.cursor()#游标
? ?sql = f"insert into lhlqianchengwuyou (update_time,positon_name, salary,job, company_type, company_name, company_size, attribute, workarea) values ('{update_time}','{positon_name}','{salary}','{job}','{company_type}','{company_name}','{company_size}','{attribute}','{workarea}')" ? ?
#sql插入语句
? ?#操作捕捉异常,如果没有异常则继续执行,如若有则抛出异常
? ?try:
? ? ? ?cursor.execute(sql)#执行sql语句
? ? ? ?cur.commit()#提交至数据库
? ?except Exception as e:
? ? ? ?print(e)
? ? ? ?print(sql)
?
?
?
#爬虫部分
a = 1#定义一个变量后面需要用到,变量根据网页上面所需参数定义(可在后面操作)
#首先封装一个函数来获取网页链接这样后面就只需要调用了
#传入参数url
#函数内定义一个变量,用requests.get取到这个网页,一点点的去试,看需要传入什么头部信息才可以取到网页源码
def get_url(url):
? ?s = requests.get(
? ? ? ?url, headers={
? ? ? ? ? ?'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
?
? ? ? }
? )
?
? ?return s.text
?
#分析网页,发现网页属于json类型的爬虫,所以直接去取到网页源码,不需要用到解析,所以之前封装中没有用到解析
count = 0
#计数,每次爬取完一个网页记一个数,方便查看爬虫进度
while a < 2001:
#分析发现每次换一页只会改变其中一个参数,所以定义一个变量a,a小于网页总页数(网页总共2000页,当然也可以使用while=True),当a大于2001时跳出循环(记得url中一定要加f不然变量不会生效)
? ?url = get_url(
? ? ? ?f'https://search.51job.com/list/000000,000000,0000,32,9,99,+,2,{a}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=')
? ?count += 1 #网页计数自增
? ?p = re.findall(r"window.__SEARCH_RESULT__ =.*?</script>", url)[0][27:-9] ?
#用正则表达式找到需要的值,可以直接取值然后用'.*?'表示匹配任意字符到下一个符合条件的字符,最后再用数据尾部结尾。
#数组取出第0项,再用切片切掉不要的数据
?
? ?#循环取值
? ?#需要用到json.loads()函数,它是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)
? ?
? ?for i in json.loads(p)['engine_jds']:
? ? ? ?positon_name = i['job_name']
? ? ? ?update_time = i["updatedate"]
? ? ? ?salary = i["providesalary_text"]
? ? ? ?workarea = i["workarea_text"]
? ? ? ?company_type = i["companytype_text"]
? ? ? ?company_size = i["companysize_text"]
? ? ? ?job = i["jobwelf"]
? ? ? ?attribute = i["attribute_text"][1]
? ? ? ?company_name = i["company_name"]
? ? ? ?print(update_time, positon_name, salary, job, company_type, company_name, company_size, attribute, workarea)#打印出是否取到值
? ? ? ?save(update_time, positon_name, salary, job, company_type, company_name, company_size, attribute, workarea)#调用前面定义的save函数,将数据写入数据库
?
? ?print(count) #打印计数
? ?a += 1 #不断循环自增,直到2001跳出
?
|