Python実戦:week 1賃貸情報を取得
4996 ワード
ジョブコード:
プロジェクトアドレス
取得結果のファイルを保存
まとめ BeautifulSoupの使用 BeautifulSoupの使い方を学び、メモをとりました
CSSセレクタを使用して、属性、クラス、id、相対位置位置決め要素、
セレクタが必要な要素を一意に特定できるかどうかを確認するには、フィルタする内容をコピーし、Webソースコードで検索し、結果が私たちが望んでいるかどうかを確認します. beautifulsoupを使用してWebページを解析する場合、requests要求の戻りオブジェクトに対してブラウザから送信された要求と得られた応答を観察する .
chromeブラウザで、ページを右クリックして、チェックして、ポップアップページの一番上のアナログ携帯電話取得ページ、逆行取得情報 を取得
WebページにPC端末とモバイル端末がある場合、相対的にモバイル端末のjs、html構造は簡単で明確になります.携帯電話のブラウザによってはJSが完全にロードされない可能性があります.
chromeのチェックでは、左上のモバイルデバイスをクリックして、携帯電話の型番を選択し、ページを更新し、携帯電話のログインをシミュレートすることができます.次に複数ページの情報 を連続的に這い出す.
URLの法則を探して、それからリストの解析式でURLの構築を完成することができます反爬取 一部のサイトでは、要求頻度の制限など、爬虫類を逆爬取したり、タイマーを追加したりして、要求間の間隔を延長することができます.
#!/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
プロジェクトアドレス
取得結果のファイルを保存
まとめ
CSSセレクタを使用して、属性、クラス、id、相対位置位置決め要素、
.get("xx")``.find_all()``.get_text()
を使用して要素に必要な情報を取得できます.セレクタが必要な要素を一意に特定できるかどうかを確認するには、フィルタする内容をコピーし、Webソースコードで検索し、結果が私たちが望んでいるかどうかを確認します.
.text
方法.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