動(dòng)手寫(xiě)爬蟲(chóng)(2):爬取58同城二手物品信息

工作這么多年一直想學(xué)習(xí)一下爬蟲(chóng)技術(shù),各種嘗試之后發(fā)現(xiàn)學(xué)習(xí)的最好方式就是直接開(kāi)干:那就找一個(gè)想爬的東西開(kāi)始爬啊!
從模仿用正則表達(dá)式爬取,到現(xiàn)在通過(guò)網(wǎng)絡(luò)課程學(xué)習(xí)使用BeatifulSoup庫(kù)來(lái)爬取信息,大概花了一個(gè)月左右的零散時(shí)間,感覺(jué)還是有些進(jìn)步的,得記錄一下,現(xiàn)在就分享一下58同城二手物品信息的爬取過(guò)程。

1.分析爬取目標(biāo)頁(yè)面與目標(biāo)

58同城二手物品頁(yè)面開(kāi)始,爬取該頁(yè)面中二手物品詳細(xì)信息。
詳細(xì)信息分布在子頁(yè)面中,故,需要先從主頁(yè)面獲取子頁(yè)面的鏈接,再?gòu)淖禹?yè)面中獲取我們的目標(biāo)信息。這樣把爬取過(guò)程分成了兩部分:
- 爬主頁(yè)面獲取二手物品子頁(yè)面的信息;
-爬取子頁(yè)面(頁(yè)面示例)獲取對(duì)應(yīng)二手物品的標(biāo)題、價(jià)格、成色、區(qū)域、發(fā)布日期、類(lèi)別等信息。
對(duì)應(yīng)的,我們查看對(duì)應(yīng)的頁(yè)面,**確定所需要爬取的元素在對(duì)應(yīng)頁(yè)面中所處的位置、確定獲取方式。

2. 爬取主頁(yè)面中的二手物品鏈接

通過(guò)chrome檢查主頁(yè)面在對(duì)應(yīng)二手物品標(biāo)題位置右鍵、檢查,查看鏈接對(duì)應(yīng)的網(wǎng)頁(yè)元素位置,復(fù)制對(duì)應(yīng)的位置表述,如下:

復(fù)制結(jié)果即是對(duì)應(yīng)的鏈接位置表述:

infolist > table:nth-child(7) > tbody > tr:nth-child(2) > td.t > a

由于網(wǎng)頁(yè)構(gòu)成中td標(biāo)簽、t樣式下的a標(biāo)簽對(duì)應(yīng)的內(nèi)容都是子頁(yè)面鏈接,故可以用‘td.t > a’作為篩選條件,通過(guò)BeautifulSoup中的select方法對(duì)其進(jìn)行篩選。代碼見(jiàn)最后部分。(注:代碼中對(duì)業(yè)面中的一些特殊物品類(lèi)別進(jìn)行了剔除,包括轉(zhuǎn)轉(zhuǎn)頁(yè)面、推薦信息部分等)

3. 爬取子頁(yè)面中物品詳細(xì)信息

將上一步獲取的子頁(yè)面鏈接傳遞給
過(guò)程與提取主頁(yè)面中鏈接是一樣的,不過(guò)這次需要提取的元素多了一些,我們按上述過(guò)程逐個(gè)檢查,確定元素對(duì)應(yīng)的篩選表述。
最后通過(guò)get_text等方式,將所需信息從爬取的元素中提取出來(lái)。

4.完整的python代碼

from bs4 import BeautifulSoup
import time
import requests

url_58 = 'http://bj.58.com/pbdn/0/'

def get_url_list(url):
    web_data = requests.get(url)
    soup = BeautifulSoup(web_data.text,'lxml')
    url = soup.select('td.t > a[class="t"]')
    url_list = ''
    for link in url:
        link_i = link.get('href')
        if 'zhuanzhuan'in link_i:
           pass
        else:
            if 'jump' in link_i:
                pass
            else:
                url_list = url_list + '\n'+link_i
    print('urllist',url_list)
    return url_list

def get_info():
    url_list = get_url_list(url_58)
    for url in url_list.split():
        time.sleep(1)
        web_data = requests.get(url)
        soup = BeautifulSoup(web_data.text,'lxml')

        type = soup.select('#header > div.breadCrumb.f12 > span:nth-of-type(3) > a')
        title = soup.select('div.col_sub.mainTitle > h1')
        date = soup.select('li.time')
        price = soup.select('div.person_add_top.no_ident_top > div.per_ad_left > div.col_sub.sumary > ul > li:nth-of-type(1) > div.su_con > span.price.c_f50')
        fineness = soup.select('div.col_sub.sumary > ul > li:nth-of-type(2) > div.su_con > span')
        area = soup.select('div.col_sub.sumary > ul > li:nth-of-type(3) > div.su_con > span')

        #print(type,title,date,price,fineness,area)

        for typei,titlei,datei,pricei,finenessi,areai in zip(type,title,date,price,fineness,area):
            data = {
                'type':typei.get_text(),
                'title':titlei.get_text(),
                'date':datei.get_text(),
                'price':pricei.get_text(),
                'fineness':(finenessi.get_text()).strip(),
                'area':list(areai.stripped_strings)
            }
            print(data)

get_info()

5.最終結(jié)果樣例

{'area': ['通州', '-', '物資學(xué)院路'], 'title': 'iPad mini 2 Wi-Fi 16G 白色 港版', 'date': '2016-05-07', 'type': '北京二手平板電腦', 'fineness': '-', 'price': '1200'}
{'area': ['西城', '-', '西單'], 'title': 'iPad2 16G 國(guó)行 WiFi 平板電腦', 'date': '2016-05-07', 'type': '北京二手平板電腦', 'fineness': '-', 'price': '900'}

6.總結(jié)

其實(shí)從網(wǎng)頁(yè)中提取對(duì)應(yīng)元素并不復(fù)雜,麻煩的是反爬、對(duì)目標(biāo)信息進(jìn)行提取(get_text、stripped_strings等等方法還需要繼續(xù)研究一下),以及對(duì)整個(gè)爬取過(guò)程的控制:通常我們要獲取的信息都不止在一個(gè)頁(yè)面上,這就需要一個(gè)好的過(guò)程調(diào)度,保證爬取效率。

以上僅供學(xué)習(xí),請(qǐng)勿用于商業(yè)用途。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容