Python実戦:week 1賃貸情報を取得

4996 ワード

ジョブコード:
#!/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)+"
") 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 """ 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): """ , url, url """ # # 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

プロジェクトアドレス
取得結果のファイルを保存
まとめ
  • BeautifulSoupの使用
  • BeautifulSoupの使い方を学び、メモをとりました
    CSSセレクタを使用して、属性、クラス、id、相対位置位置決め要素、.get("xx")``.find_all()``.get_text()を使用して要素に必要な情報を取得できます.
    セレクタが必要な要素を一意に特定できるかどうかを確認するには、フィルタする内容をコピーし、Webソースコードで検索し、結果が私たちが望んでいるかどうかを確認します.
  • .text方法
  • beautifulsoupを使用してWebページを解析する場合、requests要求の戻りオブジェクトに対して.textメソッドを呼び出す必要があります:soup = Beautifulsoup(wb_data.text,'lxml')、requests要求は応答ヘッダと応答体を含む完全なHTTP応答メッセージを返すため、応答体の中に置かれたHTMLドキュメントを解析する必要がありますので、.textでHTTP応答体を抽出します.
  • ブラウザから送信された要求と得られた応答を観察する
  • .
    chromeブラウザで、ページを右クリックして、チェックして、ポップアップページの一番上のnetworkラベルを選択して、ページをリフレッシュして、ブラウザがページHTML、JS、imagesなどのファイルをロードする過程を見ることができて、要求、返事、内容を含む
  • アナログ携帯電話取得ページ、逆行取得情報
  • を取得
    WebページにPC端末とモバイル端末がある場合、相対的にモバイル端末のjs、html構造は簡単で明確になります.携帯電話のブラウザによってはJSが完全にロードされない可能性があります.
    chromeのチェックでは、左上のモバイルデバイスをクリックして、携帯電話の型番を選択し、ページを更新し、携帯電話のログインをシミュレートすることができます.次にnetworkページのサインの左下で1つのリクエストを選択し、右側でheadersをクリックし、リクエストヘッダを見つけ、user-agentをコピーし、headersとしてrequestsのヘッダに追加する辞書を構築する.wb_data = requests.get(url, headers=headers)
  • 複数ページの情報
  • を連続的に這い出す.
    URLの法則を探して、それからリストの解析式でURLの構築を完成することができますurls = [xx{}xx.format(str(i)) for i in range(num)]
  • 反爬取
  • 一部のサイトでは、要求頻度の制限など、爬虫類を逆爬取したり、タイマーを追加したりして、要求間の間隔を延長することができます.
    import time #    time   
    
    time.sleep(1) #       ,    1s