爬取51job出現can only concatenate str (not “NoneType“) to str


養成習慣,先贊后看!!!

1.bug解釋

一個老哥在爬取51job的信息,但是中途遇到了這個bug:
在這里插入圖片描述
其實這個bug一眼看出來就是沒有一個值可以讓你來進行轉換成字符串。說白了就是有一個值可能為空,但是看出來沒有用,畢竟他這里面包含了6個參數,不確定到底是哪一個參數。
這時候我們就只需要打斷點或者是一步一步打印變量就行了,這里我選擇的是將老哥的方法進行改寫,他選擇的是直接將所有的變量一次性全部傳給一個對象,我選擇的是一個一個傳,對比一下,大家就知道了。
老哥的方法:
在這里插入圖片描述
我的方法;
在這里插入圖片描述
之后我們來對比一下我們輸出的結果
老哥結果:
在這里插入圖片描述

我的結果;
在這里插入圖片描述

我們點進網頁進去看一下發現:
在這里插入圖片描述
發現整個網頁上就沒有出現薪資的信息
大家可以對比一下就知道了,顯然就是在薪資出現None的時候老哥的代碼就報錯了。這是為啥呢?
接下來給大家講解一下。
python中的數組和Java中的列表是不一樣的
Java的數組一旦規定了列表類型就不能再添加不同類型的元素進入數組,就好比我定義了整形的列表就不能再添加字符串對象進入該列表
python就不同了,python定義的列表是可以包含不同元素的,就比方說下面這個例子:

list1 = ['physics', 'chemistry', 1997, 2000]

所以老哥添加列表元素的時候已經規定好了我的元素是字符串,這是沒有問題的,但是當money為None的時候就尷尬了,我們要知道這里的None並不是代表值為None,而是直接代表類型為None,所以這里很明顯他是不能自己轉換成String的。
但是我的就不一樣了,我是一個一個添加的,所以列表本身也不知道你添加的數據是什么類型的,所以他都會給你存儲進來。不管你是什么類型的,就算你沒有類型他也會幫你存進來。 所以我的數據沒有報錯。

2.解決方案

2.1添加try/except進行包裹

 try:
        data.append(jobpage+" "+jname+" "+money+" "+gname+" "+jinyan+" "+xuli)
    except:
        pass

運行效果:成功跑完
在這里插入圖片描述

2.2添加if/else條件判斷

    if str(moneys[0])=="<strong></strong>":
        money="面談"
    else:
        money = moneys[0].string

運行效果:成功跑完
在這里插入圖片描述

2.3添加時直接進行類型轉換

data.append(jobpage+" "+jname+" "+str(money)+" "+gname+" "+jinyan+" "+xuli)

運行效果:
在這里插入圖片描述

3.修改完后老哥的代碼

from bs4 import BeautifulSoup
# 正則表達式
import re
# 定制url,獲取網頁數據
import urllib.request,urllib.error
# 進行excel操作
import xlwt
# 進行數據庫操作
import sqlite3
# 根據需求對輸入的解析
from urllib import parse
from lxml import etree
import json
import requests



keyWord =input("請輸入需要爬取的關鍵字:")
word=parse.quote(keyWord)
newWord = parse.quote(word)
# jobData={}#每一個記錄是一個列表,把二次獲取到的網頁存成字典格式
# jobList =[] #把上面獲取到的信息放在列表中


def main():
    # 爬取網頁
    # url = "https://search.51job.com/list/090200,000000,0000,00,9,99," + newWord + ",2," + str(pageNmb) + ".html"

    # html = askUrl(url)
    # print(html)
    datalist = []
    for i in range(1,2):
        url = "https://search.51job.com/list/090200,000000,0000,00,9,99,"+newWord+",2,"+str(i)+".html"
        pagaLink=getLink(url)            #爬取列表頁,獲取該列表的全部崗位鏈接
        if len(pagaLink) == 0:
            break
        for jobpage in pagaLink:
            data=getaData(jobpage)           #一個詳情頁的鏈接
            datalist.append(data)
        print(datalist)

    # datalist = getaData(baseurl)
    # savapath = ".\\豆瓣電影251.xlsx"
    # dbpath = "movie.db"
    # 保存數據到excel
    # savaData(datalist,savapath)
    # 保存數據到數據庫
    # savaData2DB(datalist, dbpath)

# 獲取網頁信息
def getLink(url):
    dataList=[]
    #獲取到源碼
    html = askUrl(url)
    data = str(html)
    # print(data)
    find_info = re.findall(r'window.__SEARCH_RESULT__ = {(.*?)keywords', data)
    # print(find_info)
    #拼接上少了的:keywords":"找工作,求職,人才,招聘"}這一部分
    find_info = '{' + str(find_info[0]) + 'keywords":"找工作,求職,人才,招聘"}'
    # print(find_info)
    # 將獲取到內容轉換為json格式
    json_data = json.loads(find_info)
    # print(json_data)
    for i in json_data['engine_search_result']:
        dataList.append(i['job_href'])
    # print(jobList)
    # print(dataList)
    return dataList


# 二次獲取到的鏈接頁面解析
def getaData(jobpage):
    data = []
    jobHtml = askUrl(jobpage) #獲取詳情頁面
    # print(jobHtml)
    soup = BeautifulSoup(jobHtml, "html.parser")

    # data.append(jobpage)
    jnames = soup.select('h1[title]')#職位名稱
    # print(jnames)
    jname = jnames[0]["title"]
    # print(jname)
    # data.append(jname)

    moneys = soup.select("div.cn strong ")  # 待遇
    # print(moneys[0])
    if str(moneys[0])=="<strong></strong>":
        money="面談"
    else:
        money = moneys[0].string
    # data.append(money)

    gnames = soup.select(".cname > a")  # 公司名字
    gname = gnames[0]["title"]
    # data.append(gname)

    jobMlsit = soup.select("p.msg")  # 工作經驗
    list1 = jobMlsit[0]["title"].split("|")
    jinyan = list1[1].strip()
    # data.append(jinyan)

    xuli = list1[2].strip()  # 學歷
    # data.append(xuli)
    # print(xuli)
    # renshu = list1[3].strip() # 招人數
    # try:
    data.append(jobpage+" "+jname+" "+money+" "+gname+" "+jinyan+" "+xuli)
    # except:
    # pass
        # print(renshu)
    print(data)
    return data


# 爬取網頁
def askUrl(url):
    # 模擬瀏覽器信息,想豆瓣服務器發送信息
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
    }
    # 用戶代理,告訴服務器,我們是什么類型的機器,瀏覽器(本質上是告訴瀏覽器我們可以接收什么水平的內容)

    # 發送請求消息
    request = urllib.request.Request(url,headers=headers)
    html = ""
    # 捕獲異常
    try:
        # 取得響應
       response = urllib.request.urlopen(request)
        # 獲取網頁內容
       html = response.read().decode("gbk")
       # print(html)
    except urllib.error.URLError as e:
       if hasattr(e,"code"):
           print(e.code)
       if hasattr(e,"reson"):
           print(e.reson)
    return html


if __name__ == '__main__':
    main()
    # askUrl("https://jobs.51job.com/chengdu-gxq/124561448.html?s=01&t=0")
    print("爬取完畢")

都看到這里了,如果覺得對你有幫助的話,可以關注博主的公眾號,新人up需要你的支持。
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM