Python 實戰(zhàn):week1 爬取租房信息

作業(yè)代碼:

#!/usr/bin/env python
# coding: utf-8

import sys
import time
import math

from bs4 import BeautifulSoup
import requests

number = 0
detail_list = []

def detail_info(detail_urls):
    """每個詳情頁的信息"""
    global number, detail_list
    for i in detail_urls:
        number = number + 1

        detail_data = requests.get(i)
        time.sleep(1)

        detail_soup = BeautifulSoup(detail_data.text, 'lxml')
        # print detail_soup

        title_list = detail_soup.select("div.pho_info > h4 > em")
        # print title_list[0].get_text()

        address = detail_soup.select("div.pho_info > p")
        # print address[0]['title']

        price = detail_soup.select("div.day_l > span")
        # print price[0].get_text()

        img = detail_soup.select("div.pho_show_r > div > ul.detail-thumb-nav > li > img")
        # print img[0]['data-bigimg']

        fangdong_img = detail_soup.select("div.js_box.clearfix > div.member_pic > a > img")
        # print fangdong_img[0].get('src')

        name = detail_soup.select("div.js_box.clearfix > div.w_240 > h6 > a")
        # print name[0].get_text()

        gender_str = detail_soup.select("div.js_box.clearfix > div.w_240 > h6 > span")
        gender = gender_str[0]['class'][0]
        if gender == 'member_girl_ico': 
            gender_unicode = u'女'
        else:
            gender_unicode = u'男'

        detail_dict = {
            'title':title_list[0].get_text(),
            'address':address[0]['title'],
            'price':price[0].get_text(),
            'img_url':img[0]['data-bigimg'],
            'fangdong_img_url':fangdong_img[0].get('src'),
            'name':name[0].get_text(),
            'gender':gender_unicode
        }

        # detail_list.append(detail_dict)
        with open('result.txt','a') as f:
            f.write(str(detail_dict)+"\n")

        if number == 300:
            sys.exit(1)

def get_per_page_urls(url):
    """獲取每一列表頁的詳情url列表"""
    detail_urls = []
    home_data = requests.get(url)
    soup = BeautifulSoup(home_data.text, 'lxml')
    detail_info_list = soup.select("#page_list > ul > li > a")
    for i in detail_info_list:
        detail_urls.append(i.get('href'))
    return detail_urls

def get_per_detail_num():
    """獲取每一列表頁詳情url的數(shù)量"""
    url = "http://bj.xiaozhu.com/search-duanzufang-p1-0/"
    home_data = requests.get(url)
    soup = BeautifulSoup(home_data.text, 'lxml')
    count = len(soup.select("#page_list > ul > li"))
    return count

def url(num=300):
    """根據(jù)需要爬取的信息數(shù)量,計算需要請求的列表頁url普气,返回列表頁url列表"""
    # 需要爬取的頁數(shù)
    # pages = num / get_per_detail_num() + 1
    pages = int(math.ceil(float(num)/get_per_detail_num()))
    list_urls = []

    for page in range(pages):
        url = "http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(page+1)
        list_urls.append(url)
    # print list_urls
    return list_urls

for i in url():
    # print i
    detail_urls = get_per_page_urls(i)
    # print detail_urls
    detail_info(detail_urls)
    print "%s 爬取完成" % i

項目地址

保存爬取結(jié)果的文件

總結(jié)


  • BeautifulSoup 的使用

學(xué)習(xí)了一下 BeautifulSoup 的用法,并做了筆記

可以使用 CSS 選擇器佃延,通過 屬性现诀、類、id履肃、相對位置定位元素仔沿,使用.get("xx")``.find_all()``.get_text()獲取元素中需要的信息

要確保 選擇器 是否可以唯一定位我們需要的元素,可以復(fù)制要篩選的內(nèi)容尺棋,在網(wǎng)頁源代碼中搜索封锉,看結(jié)果是否?是我們想要的

  • .text方法

使用 beautifulsoup 解析網(wǎng)頁時,需要對 requests 請求的返回對象調(diào)用.text方法: soup = Beautifulsoup(wb_data.text,'lxml')膘螟,因為 requests 請求返回的是一個完整的 HTTP 響應(yīng)消息成福,包括響應(yīng)頭和響應(yīng)體,我們需要解析的是放在響應(yīng)體的中的 HTML 文檔荆残,所以用.text提取 HTTP 響應(yīng)體

  • 觀察瀏覽器發(fā)送的請求和得到的回復(fù)

chrome 瀏覽器中奴艾,右擊頁面,檢查内斯,選中彈出頁面最上方的network標(biāo)簽蕴潦,刷新頁面像啼,可以看到瀏覽器加載頁面 HTML、JS潭苞、images 這些文件的過程忽冻,包括請求、回復(fù)此疹、內(nèi)容

  • 模擬手機(jī)獲取頁面甚颂,獲取反爬取的信息

如果網(wǎng)頁既有PC端又有移動端,相對而言秀菱,移動端的js、html結(jié)構(gòu)會簡單清晰一些蹭睡,因為不同的手機(jī)瀏覽器可能不會完整加載 JS

可以在 chrome 的 檢查 中衍菱,點(diǎn)擊左上角的移動設(shè)備,選擇手機(jī)型號肩豁,刷新頁面脊串,模擬手機(jī)登陸。然后在network頁簽左下選中一個請求清钥,在右側(cè)點(diǎn)擊headers琼锋,找到請求頭部,復(fù)制 user-agent祟昭,構(gòu)造一個字典缕坎,作為headers添加到 requests 的頭部

wb_data = requests.get(url, headers=headers)

  • 連續(xù)爬取多頁信息

可以查找 URL 規(guī)律,然后用 列表解析式 完成 URL 構(gòu)建

urls = [xx{}xx.format(str(i)) for i in range(num)]

  • 反爬取

有些網(wǎng)站對爬蟲做了反爬取篡悟,比如限制請求頻率等谜叹,可以添加計時器,延長請求之間的間隔

import time # 導(dǎo)入 time 模塊

time.sleep(1) # 指定延遲時間搬葬,這里是 1s
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荷腊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子急凰,更是在濱河造成了極大的恐慌女仰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抡锈,死亡現(xiàn)場離奇詭異疾忍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)企孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門锭碳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勿璃,你說我怎么就攤上這事擒抛⊥破” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵歧沪,是天一觀的道長歹撒。 經(jīng)常有香客問我,道長诊胞,這世上最難降的妖魔是什么暖夭? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮撵孤,結(jié)果婚禮上迈着,老公的妹妹穿的比我還像新娘。我一直安慰自己邪码,他們只是感情好裕菠,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闭专,像睡著了一般奴潘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上影钉,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天画髓,我揣著相機(jī)與錄音,去河邊找鬼平委。 笑死奈虾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肆汹。 我是一名探鬼主播愚墓,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昂勉!你這毒婦竟也來了浪册?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤岗照,失蹤者是張志新(化名)和其女友劉穎村象,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攒至,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厚者,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫吐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库菲。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖志膀,靈堂內(nèi)的尸體忽然破棺而出熙宇,到底是詐尸還是另有隱情鳖擒,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布烫止,位于F島的核電站蒋荚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏馆蠕。R本人自食惡果不足惜期升,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望互躬。 院中可真熱鬧播赁,春花似錦、人聲如沸吼渡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诞吱。三九已至,卻和暖如春竭缝,著一層夾襖步出監(jiān)牢的瞬間房维,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工抬纸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咙俩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓湿故,卻偏偏與公主長得像阿趁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坛猪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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