python爬蟲58同城(多個資訊一次爬取)

噹噹和嘟嘟發表於2018-11-04


有網友留言說,這個程式碼已經不能爬取了,我2018.11.9號檢視了一下,加了一個異常處理try,現在可以用了,原因是有的資訊裡面的標籤由於促銷價格被修改為別的了,所以爬取不到就會出錯。現在 我將修改後的程式碼替換掉原有的爬取一整頁的程式碼 以及 錯誤的圖片比較

一、先爬取內容中的一項

網址如下:
URL = ‘https://bj.58.com/pingbandiannao/35923077687887x.shtml?psid=157596847202024134799949907&entinfo=35923077687887_p&slot=-1&iuType=p_1&PGTID=0d305a36-0000-19ea-0c77-0ae8025ace4f&ClickID=2
在這裡插入圖片描述

先爬取一項的程式碼

程式碼中soup.select(),不明白的地方,我後續將詳細解釋,爬出來是空列表的情況。

import requests
from bs4 import BeautifulSoup

URL = 'https://bj.58.com/pingbandiannao/35923077687887x.shtml?psid=157596847202024134799949907&entinfo=35923077687887_p&slot=-1&iuType=p_1&PGTID=0d305a36-0000-19ea-0c77-0ae8025ace4f&ClickID=2'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' }
wb_data = requests.get(URL,headers=headers)
soup = BeautifulSoup(wb_data.content, 'lxml')
#print(soup)
NameList = soup.select('h1.detail-title__name')
ProductName = NameList[0].text.strip()
PriceList = soup.select('span.infocard__container__item__main__text--price')
ProductPrice = PriceList[0].text.strip()
ViewList = soup.select('div.infocard__container__item__main')
ProductView = ViewList[1].text
AreaList = soup.select('div.infocard__container__item__main > a')
ProductArea = AreaList[0].text+'-'+AreaList[1].text
SellerNameList = soup.select('div.infocard__container__item__main > a')
SellerName = SellerNameList[2].text
CatalogueList = soup.select('div.nav > a')
Catalogue = CatalogueList[-1].text

data_dict = {
    '產品類別': Catalogue,
    '產品名稱': ProductName,
    '產品價格': ProductPrice,
    '產品成色': ProductView,
    '產品區域': ProductArea,
    '賣家姓名': SellerName
}
print(data_dict)

注意headers需要修改成自己電腦的,詳見我的部落格【python爬蟲–招聘資訊】->headers錯誤資訊,如果不寫headers會被反爬取。

爬去一項的結果

{'產品類別': '北京平板電腦', '產品名稱': 'surface pro5 I5 8G 128G, 全新未拆封', '產品價格': '5000 元', '產品成色': '全新', '產品區域': '通州-馬駒橋', '賣家姓名': '張先生'}

二、爬取一整頁

url = ‘https://bj.58.com/pingbandiannao/?PGTID=0d409654-017a-3436-09be-f01fa1e2217f&ClickID=13
在這裡插入圖片描述

一整頁程式碼

import requests
from bs4 import BeautifulSoup

#得到每個的詳細資訊
def get_info(URL):
    #URL = 'https://bj.58.com/pingbandiannao/35923077687887x.shtml?psid=157596847202024134799949907&entinfo=35923077687887_p&slot=-1&iuType=p_1&PGTID=0d305a36-0000-19ea-0c77-0ae8025ace4f&ClickID=2'
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' }
    try:
        wb_data = requests.get(URL,headers=headers)
        soup = BeautifulSoup(wb_data.content, 'lxml')
        #print(soup)
        NameList = soup.select('h1.detail-title__name')
        ProductName = NameList[0].text.strip()
        PriceList = soup.select('span.infocard__container__item__main__text--price')
        ProductPrice = PriceList[0].text.strip()

        AreaList = soup.select('div.infocard__container__item__main > a')
        ProductArea = AreaList[0].text.strip()+'-'+AreaList[1].text.strip()
        SellerNameList = soup.select('div.infocard__container__item__main > a')
        SellerName = SellerNameList[2].text
        CatalogueList = soup.select('div.nav > a')
        Catalogue = CatalogueList[-1].text

        data_dict = {
            '產品類別': Catalogue,
            '產品名稱': ProductName,
            '產品價格': ProductPrice,
            '產品區域': ProductArea,
            '賣家姓名': SellerName
        }
        print(data_dict)
    except:
        print('此項資訊被修改,所以爬取錯誤') #不想看到這句話,可以寫pass

#get_info()

'''
下面是得到一整頁中每個賣家資訊的連結,這裡只爬取了第一頁中的全部資訊,
也可以爬取好多頁。只需要將下方的url中根據每頁資訊的不同變化相應的數字頁碼。
'''
def get_all_info():
    url = 'https://bj.58.com/pingbandiannao/?PGTID=0d409654-017a-3436-09be-f01fa1e2217f&ClickID=13'
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' }
    wb_data = requests.get(url,headers=headers)
    soup = BeautifulSoup(wb_data.text, 'lxml')
    GetLink = soup.select('td.t > a')
    #print(GetLink)
    for i in GetLink:
        link = i.get('href')  #得到href連結
        #刪選是平板電腦的連結
        if 'pingbandiannao' in link:
            get_info(link)

get_all_info()

一整頁的全部資訊結果

{'產品類別': '北京平板電腦', '產品名稱': '上門回收IPAD平板電腦 IPHONE全系列', '產品價格': '4999 元', '產品區域': '北京-邢先生', '賣家姓名': ''}
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': '展櫃展示櫃鈦合金展櫃精品展櫃珠寶玉器展櫃化妝品展櫃', '產品價格': '面議', '產品區域': '東城-東城周邊', '賣家姓名': '徐經理'}
{'產品類別': '北京平板電腦', '產品名稱': '聯想Yogabook Android 128G 雅黑色', '產品價格': '2000 元', '產品區域': '朝陽-望京', '賣家姓名': '胡先生'}
此項資訊被修改,所以爬取錯誤
此項資訊被修改,所以爬取錯誤
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': '戴爾i7吃雞遊戲', '產品價格': '2800 元', '產品區域': '朝陽-東壩', '賣家姓名': 's***0'}
{'產品類別': '北京平板電腦', '產品名稱': '古董私人收購 玉器瓷器青銅器古幣字畫 現金結算收購', '產品價格': '99999 元', '產品區域': '北京-陳楓', '賣家姓名': ''}
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': '轉讓帶車指標的公司', '產品價格': '1 元', '產品區域': '朝陽-安貞', '賣家姓名': '郭先生'}
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': '華為榮耀暢玩二平板電腦', '產品價格': '650 元', '產品區域': '石景山-金頂街', '賣家姓名': 'z***3'}
{'產品類別': '北京平板電腦', '產品名稱': 'Lenovo/聯想 Miix5 I5 轉賣~', '產品價格': '4396 元', '產品區域': '石景山-衙門口', '賣家姓名': 'l***8'}
{'產品類別': '北京平板電腦', '產品名稱': '九成新轉讓平板電腦', '產品價格': '1600 元', '產品區域': '昌平-沙河', '賣家姓名': 'm***t'}
{'產品類別': '北京平板電腦', '產品名稱': '公司發的福利,一共兩臺,出售一臺', '產品價格': '1200 元', '產品區域': '豐臺-蒲黃榆', '賣家姓名': 'e***6'}
{'產品類別': '北京平板電腦', '產品名稱': '全新未拆封微軟Surface Por電腦', '產品價格': '6000 元', '產品區域': '朝陽-大屯', '賣家姓名': 'q***8'}
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': '三星TAB3 16G 8.1寸', '產品價格': '500 元', '產品區域': '大興-觀音寺', '賣家姓名': 's***5'}
{'產品類別': '北京平板電腦', '產品名稱': '小米平板便宜出需要的聯絡我', '產品價格': '500 元', '產品區域': '順義-李橋', '賣家姓名': 'f***6'}
{'產品類別': '北京平板電腦', '產品名稱': '電影孩子學習有幫助', '產品價格': '1499 元', '產品區域': '房山-閻村', '賣家姓名': 'h***r'}
此項資訊被修改,所以爬取錯誤
{'產品類別': '北京平板電腦', '產品名稱': 'surfacePro4全新基本未用', '產品價格': '4300 元', '產品區域': '豐臺-麗澤橋', '賣家姓名': '1***h'}
{'產品類別': '北京平板電腦', '產品名稱': '個人全新Ipad Pro轉讓', '產品價格': '3666 元', '產品區域': '豐臺-馬家堡', '賣家姓名': 'o***4'}
{'產品類別': '北京平板電腦', '產品名稱': '華為P20亮黑色', '產品價格': '3300 元', '產品區域': '朝陽-大山子', '賣家姓名': 'n***9'}
{'產品類別': '北京平板電腦', '產品名稱': '處理老臺式顯示器', '產品價格': '150 元', '產品區域': '朝陽-甘露園', '賣家姓名': 'x***3'}
{'產品類別': '北京平板電腦', '產品名稱': '轉全新國行未拆封ipad一臺', '產品價格': '2150 元', '產品區域': '朝陽-北苑', '賣家姓名': '小***滔'}
{'產品類別': '北京平板電腦', '產品名稱': '自用ipad air2 wifi版', '產品價格': '1800 元', '產品區域': '海淀-馬連窪', '賣家姓名': '1***o'}
{'產品類別': '北京平板電腦', '產品名稱': '海爾品牌一體電腦', '產品價格': '260 元', '產品區域': '昌平-城北', '賣家姓名': 'z***1'}

Process finished with exit code 0

圖片比較:
這裡的標籤被網頁改了,所以以前的程式碼會報錯
在這裡插入圖片描述
------------------------------------------------------------------------------------
謝謝支援,親測執行成功。注意更改headers,(好像不修改也可以用)!

相關文章