麻瓜編程·python實(shí)戰(zhàn)·2-2作業(yè):爬取58手機(jī)號(hào)

我的結(jié)果

鏈接.png
詳情.png

我的代碼

from bs4 import BeautifulSoup
import requests, pymongo, re, time, urllib, socket, json, random

# 基本頁(yè)面
url = 'http://bj.58.com/shoujihao/{}/pn{}/'
# headers
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
# 使用session
req_session = requests.session()
# 建立數(shù)據(jù)庫(kù)
client = pymongo.MongoClient('localhost', 27017)
walden = client['walden']
phone_test = walden['phone_test']
phone_info_test = walden['phone_info_test']

# 從列表頁(yè)面獲取手機(jī)號(hào)和鏈接秽褒,并存入數(shù)據(jù)庫(kù),對(duì)應(yīng)第一個(gè)結(jié)果圖
def get_phone_url(url, page, who=1):
    # 整理地址,注意who和page的位置
    search_page = url.format(who, page)
    web_data = req_session.get(search_page, headers = headers)
    soup = BeautifulSoup(web_data.text, 'lxml')
    # 如果頁(yè)碼超出范圍則pass
    if soup.find('strong'):
        # 考慮到selector結(jié)構(gòu)一樣炊邦,為了區(qū)分廣告條目编矾,這里采用了find_all搭配正則
        tel_numbers = soup.find_all('li', logr=re.compile('.*-1$'))
        tel_urls = soup.find_all('li', logr=re.compile('.*-1$'))
        for tel_number, tel_url in \
            zip(tel_numbers, tel_urls):
            tel_number = tel_number.get_text().split()[0]
            # 嵌套find_all
            tel_url = tel_url.find_all('a', 't')[0].get('href')
            # 寫入數(shù)據(jù)庫(kù)
            data = {'Url': tel_url, 'Number': tel_number}
            print(data)
            phone_test.insert_one(data)
    else:
        pass

# 從詳情頁(yè)面獲取信息
def get_phone_info(url):
    try:
        web_data = req_session.get(url, headers=headers, timeout=6)
        soup = BeautifulSoup(web_data.text, 'lxml')
        # 以防404
        four_o_four = '404' in soup.find('script', type='text/javascript').get('src').split('/')
        if four_o_four:
            pass
        else:
            title = ' '.join(soup.select('.col_sub h1')[0].get_text().split())
            price = soup.select('.price')[0].get_text().strip()
            time = soup.select('li.time')[0].get_text().strip()
            # 不是所有頁(yè)面都有區(qū)域,這里用正則表達(dá)做了一個(gè)判斷
            if re.findall('區(qū)域', str(soup.select('.col_sub'))):
                region = soup.select('.su_con a')[0].get_text().strip()
            else:
                region = None
            name = soup.select('a.tx')[0].get_text()
            contact = soup.select('span.f20')[0].get_text().strip()
            # 寫入數(shù)據(jù)庫(kù)
            phone_info_test.insert_one({
                'title': title,
                'price': price,
                'time': time,
                'region': region,
                'name': name,
                'contact': contact
            })
    # 防止報(bào)錯(cuò)
    except UnicodeDecodeError as e:
        print('-----UnicodeDecodeError url:', url)

    except urllib.error.URLError as e:
        print("-----urlError url:", url)

    except socket.timeout as e:
        print("-----socket timout:", url)

# 從里【開始】馁害,獲取10頁(yè)鏈接寫入數(shù)據(jù)庫(kù)
for single_page in range(10):
    print('頁(yè)數(shù):',single_page + 1, '\n', '-'*60)
    time.sleep(10)
    get_phone_url(url, single_page)

# 從數(shù)據(jù)庫(kù)獲取鏈接
for item in phone_test.find():
    print(item['Url'])
    info_page = item['Url']
    get_phone_info(info_page)
    time.sleep(1)

我的感想:

  • 我估計(jì)我花了5個(gè)多小時(shí)窄俏,處理了挺多大大小小的坑,主要的坑點(diǎn)在于:廣告的剔除碘菜,個(gè)別結(jié)構(gòu)差異的地方(頁(yè)面超出范圍凹蜈、404等)要做判斷,以及老是報(bào)錯(cuò)‘Max retries exceeded with url’
  • 對(duì)于坑點(diǎn):
    • 我覺得我用正則來(lái)剔除廣告有點(diǎn)“霸王硬上弓”忍啸,別的同學(xué)通過(guò)篩選鏈接來(lái)處理挺簡(jiǎn)單明了仰坦,但需要一些細(xì)心和意識(shí)。


      廣告.png

      正常.png

      從地址來(lái)剔除廣告.png
  • 對(duì)于‘Max retries exceeded with url’呢计雌。以我目前的經(jīng)驗(yàn):要么等會(huì)弄悄晃,要么調(diào)整sleep的時(shí)間,要么加proxy白粉,要么改headers传泊,屬于一種瞎子摸象的狀態(tài)。
  • 對(duì)于結(jié)構(gòu)上的差異或許需要經(jīng)驗(yàn)來(lái)培養(yǎng)意識(shí)鸭巴,像404的排除眷细,頁(yè)碼范圍的超出,老師講出來(lái)順理成章鹃祖,但自己操作起來(lái)還是挺生疏的溪椎。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恬口,隨后出現(xiàn)的幾起案子校读,更是在濱河造成了極大的恐慌,老刑警劉巖祖能,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉秫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡养铸,警方通過(guò)查閱死者的電腦和手機(jī)雁芙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钞螟,“玉大人兔甘,你說(shuō)我怎么就攤上這事×郾酰” “怎么了洞焙?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澡匪,道長(zhǎng)熔任,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任仙蛉,我火速辦了婚禮笋敞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荠瘪。我一直安慰自己夯巷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布哀墓。 她就那樣靜靜地躺著趁餐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪篮绰。 梳的紋絲不亂的頭發(fā)上后雷,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吠各,去河邊找鬼臀突。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贾漏,可吹牛的內(nèi)容都是我干的候学。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纵散,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梳码!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起伍掀,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掰茶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蜜笤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體濒蒋,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年把兔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啊胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垛贤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趣倾,到底是詐尸還是另有隱情聘惦,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站善绎,受9級(jí)特大地震影響黔漂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禀酱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一炬守、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剂跟,春花似錦减途、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至送淆,卻和暖如春税产,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷崩。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工辟拷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阐斜。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓衫冻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親智听。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽杰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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