Pythonクローラー実戦、リクエスト+パーセルモジュール、中古住宅情報データのクロール

序文

最近、Pythonを使って中古住宅情報データのクロールを試みているのですが、必要な方のためにコードを提供し、コツをお伝えします。

まず、クロールする前に、できるだけクローラーと認識されずにブラウザのふりをする必要があります.基本はリクエストヘッダーを追加することですが、このようなプレーンテキストデータをクロールする人が多くなるため、プロキシ IP の変更とランダム置換を検討するには リクエスト ヘッダーの方法を使用して、住宅価格データをクロールします。

毎回クローラー コードを記述する前に、最初の最も重要なステップは、Web ページを分析することです。

今回の例では、各ページの特定の各リストのリンクを取得し、2 番目のレベルの Web ページに入って詳細情報を取得し、上位レベルの Web ページに戻ってプロセスを繰り返す必要があります。

分析の結果、クロール処理中はクロール速度が比較的遅いことが判明したため、Google ブラウザの画像や JavaScript などを無効にすることで、クローラーのクロール速度を改善することもできます。

開発ツール

Python バージョン: 3.8

関連モジュール:

要求モジュール
パーサー モジュール

環境構築

Python をインストールして環境変数に追加すると、必要な関連モジュールが pip によってインストールされます。

アイデア分析

クロールされたページを次の図に示します。

ここに画像の説明を挿入

ページデータを抽出する

ブラウザーでクロールするページを開き
、F12 キーを押して開発者ツールに入り、必要なデータがここにある場所を確認します.
必要なのは、一覧ページのデータだけです.
ページデータ

コード

# 伪装
headers = {
    
    
    'cookie': 'aQQ_ajkguid=B7A0A0B5-30EC-7A66-7500-D8055BFFE0FA; ctid=27; id58=CpQCJ2Lbhlm+lyRwdY5QAg==; _ga=GA1.2.2086942850.1658553946; wmda_new_uuid=1; wmda_uuid=009620ee2a2138d3bd861c92362a5d28; wmda_visited_projects=%3B6289197098934; 58tj_uuid=8fd994c2-35cc-405f-b671-2c1e51aa100c; als=0; ajk-appVersion=; sessid=8D76CC93-E1C8-4792-9703-F864FF755D63; xxzl_cid=2e5a66fa054e4134a15bc3f5b47ba3ab; xzuid=e60596c8-8985-4ab3-a5df-90a202b196a3; fzq_h=4c8d83ace17a19ee94e55d91124e7439_1666957662955_85c23dcb9b084efdbc4ac519c0276b68_2936029006; fzq_js_anjuke_ershoufang_pc=75684287c0be96cac08d04f4d6cc6d09_1666957664522_25; twe=2; xxzl_cid=2e5a66fa054e4134a15bc3f5b47ba3ab; xxzl_deviceid=OOpJsA5XrQMdJFfv71dg+l+he0O1OKPQgRAQcFPbeRAyhjZ4/7gS3Gj4DfiLjxfc; isp=true; obtain_by=2; new_session=1; init_refer=https%253A%252F%252Fcs.anjuke.com%252F; new_uv=3',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}
1.发送请求
response = requests.get(url=url, headers=headers)
2.获取数据
html_data = response.text
3.解析数据
 select = parsel.Selector(html_data)
    divs = select.css('.property-content')
    for div in divs:
        # .property-content-title-name   标题
        标题 = is_null(div.css('.property-content-title-name::text').get())
        # .property-content-info:nth-child(1) .property-content-info-text:nth-child(1) span  户型
        户型s = div.css('.property-content-info:nth-child(1) .property-content-info-text:nth-child(1) span::text').getall()
        户型 = ' '.join(户型s)
        # .property-content-info:nth-child(1) .property-content-info-text:nth-child(2)  面积
        面积 = is_null(div.css('.property-content-info:nth-child(1) .property-content-info-text:nth-child(2)::text').get())
        # .property-content-info:nth-child(1) .property-content-info-text:nth-child(3)  朝向
        朝向 = is_null(div.css('.property-content-info:nth-child(1) .property-content-info-text:nth-child(3)::text').get())
        # .property-content-info:nth-child(1) .property-content-info-text:nth-child(4)  楼层
        楼层 = is_null(div.css('.property-content-info:nth-child(1) .property-content-info-text:nth-child(4)::text').get())
        # .property-content-info:nth-child(1) .property-content-info-text:nth-child(5)  年份
        年份 = is_null(div.css('.property-content-info:nth-child(1) .property-content-info-text:nth-child(5)::text').get())
        # .property-content-info:nth-child(2) .property-content-info-comm-name  小区名称
        小区名称 = is_null(div.css('.property-content-info:nth-child(2) .property-content-info-comm-name::text').get())
        # .property-content-info:nth-child(2) .property-content-info-comm-address  小区地址
        小区地址 = is_null(div.css('.property-content-info:nth-child(2) .property-content-info-comm-address::text').get())
        # .property-content-info:nth-child(3) span  小区标签
        小区标签s = div.css('.property-content-info:nth-child(3) span::text').getall()
        小区标签 = ' '.join(小区标签s)
        # .property-price .property-price-total .property-price-total-num  总价
        总价 = is_null(div.css('.property-price .property-price-total .property-price-total-num::text').get())
        # .property-price .property-price-average  每平方米的价格
        单价 = is_null(div.css('.property-price .property-price-average::text').get())
        print(标题, 户型, 面积, 朝向, 楼层, 年份, 小区名称, 小区地址, 小区标签, 总价, 单价)
4.保存数据
        with open('安居客.csv', mode='a', encoding='utf-8', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow([标题, 户型, 面积, 朝向, 楼层, 年份, 小区名称, 小区地址, 小区标签, 总价, 单价])

結果表示

結果
ps:写真は参考用です

やっと

今日の共有はここまでです。興味のある友達も試すことができます。

この記事について質問がある場合、または python について他に質問がある場合は、コメント欄にメッセージを残すか、私にプライベート メッセージを送信してください。

シェアした記事が良いと思ったらフォローor高評価お願いします(/≧▽≦)/

おすすめ

転載: blog.csdn.net/Modeler_xiaoyu/article/details/128181390