鱼C论坛

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

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

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

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

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

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

使用道具 举报

发表于 2020-4-18 13:32:24 From FishC Mobile | 显示全部楼层
我怀疑你没有获取数据
你可以在适当的地方放置一些print语句,查看一下
想知道小甲鱼最近在做啥?请访问 -> 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 来改进数据提取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 16:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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