鱼C论坛

 找回密码
 立即注册
查看: 2723|回复: 2

[已解决]刚学完爬虫,请问大佬们我这代码错在哪里了

[复制链接]
发表于 2020-4-17 23:23:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from bs4 import BeautifulSoup     #网页解析,获取数据
  2. import re       #正则表达式,进行文字匹配
  3. import urllib.request,urllib.error      #制定URL,获取网页数据
  4. import xlwt     #进行excel操作
  5. import sqlite3  #进行SQLite数据库操作





  6. def main():
  7.     baseurl = "https://www.zhipin.com/c101020100/?query=python&page="
  8.     datalist = getData(baseurl)
  9.     savepath = "BOSS直聘.xls"
  10.     saveData(datalist,savepath)


  11. #获取职业链接
  12. findLink = re.compile(r'<div class="primary-box" href="(.*?)">')


  13. #获取职业名称
  14. 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>')

  15. #获取工作地址
  16. findarea = re.compile(r'<span class="job-area">(.*)</span>')


  17. #获取工资
  18. findwage = re.compile(r'<span class="red">(\d*)K</span>')

  19. #获取要求工作经验
  20. findexp = re.compile(r'<p>(.*)年<em class="vline">')

  21. #获取要求工作学历
  22. findRec = re.compile(r'<em class="vline"></em>(.*)</em>')

  23. #获取待遇
  24. findTreatment = re.compile(r'<div class="info-desc">(.*)</div>')



  25. #爬取网页
  26. def getData(baseurl):
  27.     datalist = []
  28.     for i in range(0,10):       #调用获取页面信息的函数,10次
  29.         url = baseurl + str(i*30)
  30.         html = askURL(url)      #保存获取到的网页源码

  31.          # 2.逐一解析数据
  32.         soup = BeautifulSoup(html,"html.parser")
  33.         for item in soup.find_all('div',class_="item"):     #查找符合要求的字符串,形成列表
  34.             #print(item)   #测试:查看item全部信息
  35.             data = []    #保存一部所有信息
  36.             item = str(item)

  37.             #工作的链接
  38.             link = re.findall(findLink,item)[0]     #re库用来通过正则表达式查找指定的字符串
  39.             data.append(link)                       #添加链接

  40.             name = re.findall(findname,item)[0]
  41.             data.append(name)                     #添加工作名字



  42.             area = re.findall(findarea,item)[0]
  43.             data.append(area)                        #添加工作地址

  44.             wage = re.findall(findwage,item)[0]
  45.             data.append(wage)                       #添加工资

  46.             exp = re.findall(findexp,item)[0]
  47.             data.append(exp)                        #添加要求工作经验


  48.             rec = re.findall(findRec,item)[0]
  49.             data.append(rec)                  #添加要求工作学历


  50.             treatment = re.findall(findTreatment,item)          #工作待遇
  51.             if len(treatment) != 0:
  52.                 inq = treatment[0].replace("。","")    #去掉句号
  53.                 data.append(treatment)                # 添加概述
  54.             else:
  55.                 data.append(" ")                #留空



  56.             datalist.append(data)       #把处理好的信息放入datalist

  57.     return datalist


  58. #得到指定一个URL的网页内容
  59. def askURL(url):
  60.     head = {
  61.         "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"
  62.     }


  63.     request = urllib.request.Request(url,headers=head)
  64.     html = ""
  65.     try:
  66.         response = urllib.request.urlopen(request)
  67.         html = response.read().decode("utf-8")
  68.         #print(html)
  69.     except urllib.error.URLError as e:
  70.         if hasattr(e,"code"):
  71.             print(e.code)
  72.         if hasattr(e,"reason"):
  73.             print(e.reason)
  74.     return html


  75. def saveData(datalist,savepath):
  76.     print("保存中....")
  77.     book = xlwt.Workbook(encoding="utf-8",style_compression=0)                              #创建workbook对象
  78.     sheet = book.add_sheet('BOSS直聘.xls',cell_overwrite_ok=True)                           #创建工作表
  79.     col = ("工作链接","工作名字","工资","要求工作经验","要求工作学历","工作待遇",)
  80.     for i in range(0,6):
  81.         sheet.write(0,i,col[i])                                                             # 每一列列名
  82.     for i in range(0,250):
  83.         print("第%d条" %(i+1))
  84.         data = datalist[i]
  85.         for j in range(0,6):
  86.             sheet.write(i+1,j,data[j])      #数据

  87.     book.save(savepath)       #保存

  88. if __name__ == "__main__":          #当程序执行时
  89. #调用函数
  90.     main()
  91.     print("爬取完毕!")




复制代码
最佳答案
2024-9-4 18:42:34
希望能帮你
1. 正则表达式不匹配
正则表达式 findLink 是不正确的,因为它试图匹配一个不存在的 href 属性在 div 标签中。实际上,链接通常位于 a 标签中。
2. BeautifulSoup 和正则表达式的混合使用
既然已经使用了 BeautifulSoup 来解析 HTML,最好继续使用它来提取数据,而不是混合使用正则表达式。
3. 网页结构可能变化
网页的结构可能会变化,使用 BeautifulSoup 可以更好地适应这些变化。
4. Excel 写入数据
在写入 Excel 时,您应该检查 datalist 的长度,以避免索引超出范围。
5. 改进的数据提取
我将使用 BeautifulSoup 来改进数据提取。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-18 13:32:24 From FishC Mobile | 显示全部楼层
我怀疑你没有获取数据
你可以在适当的地方放置一些print语句,查看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-4 18:42:34 | 显示全部楼层    本楼为最佳答案   
希望能帮你
1. 正则表达式不匹配
正则表达式 findLink 是不正确的,因为它试图匹配一个不存在的 href 属性在 div 标签中。实际上,链接通常位于 a 标签中。
2. BeautifulSoup 和正则表达式的混合使用
既然已经使用了 BeautifulSoup 来解析 HTML,最好继续使用它来提取数据,而不是混合使用正则表达式。
3. 网页结构可能变化
网页的结构可能会变化,使用 BeautifulSoup 可以更好地适应这些变化。
4. Excel 写入数据
在写入 Excel 时,您应该检查 datalist 的长度,以避免索引超出范围。
5. 改进的数据提取
我将使用 BeautifulSoup 来改进数据提取。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表