コンテンツ
1序文
1.1生存の圧力によってもたらされた哲学
マルサスは、等比数列に従って増殖する生物の生来の能力が、実際の生存可能性または実際の生存個体数よりも常に大きいことを最初に発見しました。次に、生物の種内競争は非常に残酷で避けられないものでなければならないと推測されます。マルサスが人類に対応する警告を発する必要があるかどうかは別として、それはこの現象に内在する一連の基本的な質問にすぎません。たとえば、生物が過剰生産する能力の自然な限界は何ですか?種内競争の生存者が勝つために依存している利点は何ですか?そして、これらのいわゆる有利なグループはどこに自分自身を導きますか?などなど、考えている人なら誰でも深く考えさせる(恐れる)だけで十分です。
後に、彼の画期的な本「種の起源」の序文で、ダーウィンはマルサスの理論の科学的貢献と啓蒙について意図的に言及しました。老僧の懐かしい友人であることが一般の人々に適格ではないことがわかります。 !!
1.2家と家の奴隷を買う
今結婚するとき、女性は一般的に男性に家と車を持っていることを要求します。実際、あなたは女の子を責めることはできません。今日の高度に発達した激動の社会では、この要求は実際には高くありません。しかし、改革開放以来、階級は固まり、私たちの世代は困っています!貴陽の住宅価格を見てみましょう(Lianjia新築住宅:https ://gy.fang.lianjia.com/ )
時代によって排除することはできず、常にため息をつくことはできません。ゼロから始めた大資本家は非常に少なく、劉強東はその一人です。アイドルはアイドルであり、現実に戻り、田舎の子供たちは家を買うかもしれませんし、一生家の奴隷になるかもしれません。田舎に戻ると、明るく美しい外観を持つ他の人に賞賛され、彼らだけが知っています彼らの心の痛みと不満。そういう意味で、私は個人的に家の奴隷や車の奴隷になりたくありません。私の幸せは私自身であり、私の人生は私自身であり、私は他人に見られないように自分自身の素晴らしい人生を送っています。私自身の運命は美しくカラフルです。私がしていることは私の能力を向上させることです、私は家の奴隷になりたくありません!
心は血だらけで、ため息は終わり、今日のテーマに戻る時が来ました。これらのデータを分析と分析のためにドキュメントテーブルに入れて、あなたの言うことを実行し、クローラーを使用してクロールし、それをドキュメントに書き込んでみませんか。
2匹の爬虫類
2.1基本概念
Webクローラー(クローラー): WebスパイダーまたはWebロボット(ロボット)とも呼ばれます。これは、特定のルールに従ってWorldWideWebから情報を自動的に取得するプログラムまたはスクリプトです。つまり、Webページのリンクアドレスに基づいてWebページのコンテンツを自動的に取得できます。インターネットを大きな蜘蛛の巣と比較すると、そこには多くの蜘蛛の巣があり、蜘蛛の巣はすべての蜘蛛の巣のコンテンツを取得できます。
クローラーは、Webサイトを要求する人間の動作をシミュレートし、Webサイトのリソースをバッチでダウンロードするプログラムまたは自動スクリプトです。クローラー:技術的な手段を使用して、Webサイト情報をバッチで取得する方法。重要なのはバッチサイズです。
クローラー防止:技術的な手段を使用して、他の人が自分のWebサイトの情報をバッチで取得するのを防ぐ方法。重要なのはバッチサイズでもあります。
偶発的な怪我:クロール防止の過程で、一般ユーザーは誤ってクローラーとして識別されます。事故による負傷率の高い爬虫類対策は、どんなに効果があっても使えません。
ブロック:クローラーアクセスを正常にブロックしました。ここに傍受率の概念があります。一般的に言って、爬虫類対策戦略の傍受率が高いほど、偶発的な怪我の可能性が高くなります。したがって、トレードオフを行う必要があります。
リソース:機械コストと人件費の合計。
2.2クローラーの基本的なプロセス
(1)Webページを要求する:
HTTPライブラリを介してターゲットサイトへの要求を開始します。つまり、要求を送信します。要求には追加のヘッダーやその他の
情報を含めることができ、サーバーが応答するのを待ちます!
(2)対応するコンテンツ:
サーバーが正常に応答できる場合、サーバーは応答を取得します。応答のコンテンツは取得するページのコンテンツであり、タイプはHTML、Json文字列、バイナリデータ(写真やビデオなど)などです。タイプ。
(3)コンテンツ
の解析:取得されたコンテンツはHTMLである可能性があり、正規表現およびWebページ解析ライブラリを使用して解析できます。これは、Jsonオブジェクトの解析に直接変換できるJsonの場合もあれば、
保存またはさらに処理できるバイナリデータの場合もあります。
(4)データの保存と分析:
さまざまな形式で保存し、テキストとして保存したり、データベースに保存したり、特定の形式で保存したりできます。
テストケース:
コードの実装:貴陽の住宅価格のページデータをクロールします
#==========导 包=============
import requests
#=====step_1 : 指 定 url=========
url = 'https://gy.fang.lianjia.com/ /'
#=====step_2 : 发 起 请 求 :======
#使 用 get 方 法 发 起 get 请 求 , 该 方 法 会 返 回 一 个 响 应 对 象 。 参 数 url 表 示 请 求 对 应 的 url
response = requests . get ( url = url )
#=====step_3 : 获 取 响 应 数 据 :===
#通 过 调 用 响 应 对 象 的 text 属 性 , 返 回 响 应 对 象 中 存 储 的 字 符 串 形 式 的 响 应 数 据 ( 页 面 源 码数 据 )
page_text = response . text
#====step_4 : 持 久 化 存 储=======
with open ('贵阳房价 . html ','w', encoding ='utf -8') as fp:
fp.write ( page_text )
print (' 爬 取 数 据 完 毕 !!!')
爬 取 数 据 完 毕 !!!
Process finished with exit code 0
3貴陽の住宅価格を這い回ってテーブルに書く
3.1結果の表示
3.2コードの実装(Python)
#==================导入相关库==================================
from bs4 import BeautifulSoup
import numpy as np
import requests
from requests.exceptions import RequestException
import pandas as pd
#=============读取网页=========================================
def craw(url,page):
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
html1 = requests.request("GET", url, headers=headers,timeout=10)
html1.encoding ='utf-8' # 加编码,重要!转换为字符串编码,read()得到的是byte格式的
html=html1.text
return html
except RequestException:#其他问题
print('第{0}读取网页失败'.format(page))
return None
#==========解析网页并保存数据到表格======================
def pase_page(url,page):
html=craw(url,page)
html = str(html)
if html is not None:
soup = BeautifulSoup(html, 'lxml')
"--先确定房子信息,即li标签列表--"
houses=soup.select('.resblock-list-wrapper li')#房子列表
"--再确定每个房子的信息--"
for j in range(len(houses)):#遍历每一个房子
house=houses[j]
"名字"
recommend_project=house.select('.resblock-name a.name')
recommend_project=[i.get_text()for i in recommend_project]#名字 英华天元,斌鑫江南御府...
recommend_project=' '.join(recommend_project)
#print(recommend_project)
"类型"
house_type=house.select('.resblock-name span.resblock-type')
house_type=[i.get_text()for i in house_type]#写字楼,底商...
house_type=' '.join(house_type)
#print(house_type)
"销售状态"
sale_status = house.select('.resblock-name span.sale-status')
sale_status=[i.get_text()for i in sale_status]#在售,在售,售罄,在售...
sale_status=' '.join(sale_status)
#print(sale_status)
"大地址"
big_address=house.select('.resblock-location span')
big_address=[i.get_text()for i in big_address]#
big_address=''.join(big_address)
#print(big_address)
"具体地址"
small_address=house.select('.resblock-location a')
small_address=[i.get_text()for i in small_address]#
small_address=' '.join(small_address)
#print(small_address)
"优势。"
advantage=house.select('.resblock-tag span')
advantage=[i.get_text()for i in advantage]#
advantage=' '.join(advantage)
#print(advantage)
"均价:多少1平"
average_price=house.select('.resblock-price .main-price .number')
average_price=[i.get_text()for i in average_price]#16000,25000,价格待定..
average_price=' '.join(average_price)
#print(average_price)
"总价,单位万"
total_price=house.select('.resblock-price .second')
total_price=[i.get_text()for i in total_price]#总价400万/套,总价100万/套'...
total_price=' '.join(total_price)
#print(total_price)
#=====================写入表格=================================================
information = [recommend_project, house_type, sale_status,big_address,small_address,advantage,average_price,total_price]
information = np.array(information)
information = information.reshape(-1, 8)
information = pd.DataFrame(information, columns=['名称', '类型', '销售状态','大地址','具体地址','优势','均价','总价'])
information.to_csv('贵阳房价.csv', mode='a+', index=False, header=False) # mode='a+'追加写入
print('第{0}页存储数据成功'.format(page))
else:
print('解析失败')
#==================双线程=====================================
import threading
for i in range(1,100,2):#遍历网页1-101
url1="https://gy.fang.lianjia.com/loupan/pg"+str(i)+"/"
url2 = "https://gy.fang.lianjia.com/loupan/pg" + str(i+1) + "/"
t1 = threading.Thread(target=pase_page, args=(url1,i))#线程1
t2 = threading.Thread(target=pase_page, args=(url2,i+1))#线程2
t1.start()
t2.start()