|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 来改进数据提取。
|
|