马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作
def main():
baseurl = "https://www.zhipin.com/c101020100/?query=python&page="
datalist = getData(baseurl)
savepath = "BOSS直聘.xls"
saveData(datalist,savepath)
#获取职业链接
findLink = re.compile(r'<div class="primary-box" href="(.*?)">')
#获取职业名称
findname = re.compile(r'<a href="/job_detail/c9fd4b764e292df61HFz2N26GFs~.html" title="Python" target="_blank" ka="search_list_jname_4" data-jid="c9fd4b764e292df61HFz2N26GFs~" data-itemid="4" data-lid="nlp-4mXnCYQcXG4.search.4" data-jobid="35930789" data-index="3">(.*)</a>')
#获取工作地址
findarea = re.compile(r'<span class="job-area">(.*)</span>')
#获取工资
findwage = re.compile(r'<span class="red">(\d*)K</span>')
#获取要求工作经验
findexp = re.compile(r'<p>(.*)年<em class="vline">')
#获取要求工作学历
findRec = re.compile(r'<em class="vline"></em>(.*)</em>')
#获取待遇
findTreatment = re.compile(r'<div class="info-desc">(.*)</div>')
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10): #调用获取页面信息的函数,10次
url = baseurl + str(i*30)
html = askURL(url) #保存获取到的网页源码
# 2.逐一解析数据
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表
#print(item) #测试:查看item全部信息
data = [] #保存一部所有信息
item = str(item)
#工作的链接
link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
data.append(link) #添加链接
name = re.findall(findname,item)[0]
data.append(name) #添加工作名字
area = re.findall(findarea,item)[0]
data.append(area) #添加工作地址
wage = re.findall(findwage,item)[0]
data.append(wage) #添加工资
exp = re.findall(findexp,item)[0]
data.append(exp) #添加要求工作经验
rec = re.findall(findRec,item)[0]
data.append(rec) #添加要求工作学历
treatment = re.findall(findTreatment,item) #工作待遇
if len(treatment) != 0:
inq = treatment[0].replace("。","") #去掉句号
data.append(treatment) # 添加概述
else:
data.append(" ") #留空
datalist.append(data) #把处理好的信息放入datalist
return datalist
#得到指定一个URL的网页内容
def askURL(url):
head = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
#print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
def saveData(datalist,savepath):
print("保存中....")
book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
sheet = book.add_sheet('BOSS直聘.xls',cell_overwrite_ok=True) #创建工作表
col = ("工作链接","工作名字","工资","要求工作经验","要求工作学历","工作待遇",)
for i in range(0,6):
sheet.write(0,i,col[i]) # 每一列列名
for i in range(0,250):
print("第%d条" %(i+1))
data = datalist[i]
for j in range(0,6):
sheet.write(i+1,j,data[j]) #数据
book.save(savepath) #保存
if __name__ == "__main__": #当程序执行时
#调用函数
main()
print("爬取完毕!")
希望能帮你
1. 正则表达式不匹配
正则表达式 findLink 是不正确的,因为它试图匹配一个不存在的 href 属性在 div 标签中。实际上,链接通常位于 a 标签中。
2. BeautifulSoup 和正则表达式的混合使用
既然已经使用了 BeautifulSoup 来解析 HTML,最好继续使用它来提取数据,而不是混合使用正则表达式。
3. 网页结构可能变化
网页的结构可能会变化,使用 BeautifulSoup 可以更好地适应这些变化。
4. Excel 写入数据
在写入 Excel 时,您应该检查 datalist 的长度,以避免索引超出范围。
5. 改进的数据提取
我将使用 BeautifulSoup 来改进数据提取。
|