【scrapy實踐】_爬取安居客_廣州_新樓盤數據

来源:http://www.cnblogs.com/coskaka/archive/2016/12/12/6165520.html
-Advertisement-
Play Games

需求:爬取【安居客—廣州—新樓盤】的數據,具體到每個樓盤的詳情頁的若幹欄位。 難點:樓盤類型各式各樣:住宅 別墅 商住 商鋪 寫字樓,不同樓盤欄位的名稱不一樣。然後同一種類型,比如住宅,又分為不同的情況,比如分為期房在售,現房在售,待售,尾盤。其他類型也有類似情況。所以欄位不能設置固定住。 解決方案 ...


需求:爬取【安居客—廣州—新樓盤】的數據,具體到每個樓盤的詳情頁的若幹欄位。

難點:樓盤類型各式各樣:住宅 別墅 商住 商鋪 寫字樓,不同樓盤欄位的名稱不一樣。然後同一種類型,比如住宅,又分為不同的情況,比如分為期房在售,現房在售,待售,尾盤。其他類型也有類似情況。所以欄位不能設置固定住。

解決方案:目前想到的解決方案,第一種:scrapy中items.py中不設置欄位,spider中爬的時候自動識別欄位(也就是有啥欄位就保留下來),然後返回字典存起來。第二種,不同欄位的網頁分別寫規則單獨抓取。顯然不可取。我採用的是第一種方案。還有其他方案的朋友們,歡迎交流哈。

目標網址為:http://gz.fang.anjuke.com/ 該網頁下的樓盤數據

示例樓盤網址:http://gz.fang.anjuke.com/loupan/canshu-298205.html?from=loupan_tab

開始編寫scrapy腳本。建立工程步驟略過。

1、count.py

 1 __author__ = 'Oscar_Yang'
 2 #-*- coding= utf-8 -*-
 3 """
 4     查看mongodb存儲狀況的腳本count.py
 5 """
 6 import time
 7 import pymongo
 8 client = pymongo.MongoClient("localhost", 27017)
 9 db = client["SCRAPY_anjuke_gz"]
10 sheet = db["anjuke_doc1"]
11 
12 while True:
13     print(sheet.find().count())
14     print("____________________________________")
15     time.sleep(3)

1 """
2     entrypoint.py
3 """
4 from scrapy.cmdline import execute
5 execute(['scrapy', 'crawl', 'anjuke_gz'])
 1 # -*- coding: utf-8 -*-
 2 """
 3     settings.py
 4 """
 5 
 6 # Scrapy settings for anjuke_gz project
 7 #
 8 # For simplicity, this file contains only settings considered important or
 9 # commonly used. You can find more settings consulting the documentation:
10 #
11 #     http://doc.scrapy.org/en/latest/topics/settings.html
12 #     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
13 #     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
14 
15 BOT_NAME = 'anjuke_gz'
16 
17 SPIDER_MODULES = ['anjuke_gz.spiders']
18 NEWSPIDER_MODULE = 'anjuke_gz.spiders'
19 MONGODB_HOST = "127.0.0.1"
20 MONGODB_PORT = 27017
21 MONGODB_DBNAME="SCRAPY_anjuke_gz"
22 MONGODB_DOCNAME="anjuke_doc1"
23 
24 # Crawl responsibly by identifying yourself (and your website) on the user-agent
25 #USER_AGENT = 'anjuke_gz (+http://www.yourdomain.com)'
26 
27 # Obey robots.txt rules
28 ROBOTSTXT_OBEY = False
29 
30 # Configure maximum concurrent requests performed by Scrapy (default: 16)
31 #CONCURRENT_REQUESTS = 32
32 
33 # Configure a delay for requests for the same website (default: 0)
34 # See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
35 # See also autothrottle settings and docs
36 #DOWNLOAD_DELAY = 3
37 # The download delay setting will honor only one of:
38 #CONCURRENT_REQUESTS_PER_DOMAIN = 16
39 #CONCURRENT_REQUESTS_PER_IP = 16
40 
41 # Disable cookies (enabled by default)
42 #COOKIES_ENABLED = False
43 
44 # Disable Telnet Console (enabled by default)
45 #TELNETCONSOLE_ENABLED = False
46 
47 # Override the default request headers:
48 #DEFAULT_REQUEST_HEADERS = {
49 #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
50 #   'Accept-Language': 'en',
51 #}
52 
53 # Enable or disable spider middlewares
54 # See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
55 #SPIDER_MIDDLEWARES = {
56 #    'anjuke_gz.middlewares.AnjukeGzSpiderMiddleware': 543,
57 #}
58 
59 # Enable or disable downloader middlewares
60 # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
61 #DOWNLOADER_MIDDLEWARES = {
62 #    'anjuke_gz.middlewares.MyCustomDownloaderMiddleware': 543,
63 #}
64 
65 # Enable or disable extensions
66 # See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
67 #EXTENSIONS = {
68 #    'scrapy.extensions.telnet.TelnetConsole': None,
69 #}
70 
71 # Configure item pipelines
72 # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
73 ITEM_PIPELINES = {
74    'anjuke_gz.pipelines.AnjukeGzPipeline': 300,
75 }
76 
77 # Enable and configure the AutoThrottle extension (disabled by default)
78 # See http://doc.scrapy.org/en/latest/topics/autothrottle.html
79 #AUTOTHROTTLE_ENABLED = True
80 # The initial download delay
81 #AUTOTHROTTLE_START_DELAY = 5
82 # The maximum download delay to be set in case of high latencies
83 #AUTOTHROTTLE_MAX_DELAY = 60
84 # The average number of requests Scrapy should be sending in parallel to
85 # each remote server
86 #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
87 # Enable showing throttling stats for every response received:
88 #AUTOTHROTTLE_DEBUG = False
89 
90 # Enable and configure HTTP caching (disabled by default)
91 # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
92 HTTPCACHE_ENABLED = True
93 HTTPCACHE_EXPIRATION_SECS = 0
94 HTTPCACHE_DIR = 'httpcache'
95 HTTPCACHE_IGNORE_HTTP_CODES = []
96 HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

接下來,是items。因為沒有設置欄位,為預設的代碼。

 1 # -*- coding: utf-8 -*-
 2 
 3 # Define here the models for your scraped items
 4 #
 5 # See documentation in:
 6 # http://doc.scrapy.org/en/latest/topics/items.html
 7 
 8 import scrapy
 9 
10 
11 class AnjukeGzItem(scrapy.Item):
12     # define the fields for your item here like:
13     # name = scrapy.Field()
14     pass

接下來,是piplines.py。在中設置了mongodb的配置。

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


import pymongo
from scrapy.conf import settings

class AnjukeGzPipeline(object):
    def __init__(self):
        host=settings["MONGODB_HOST"]
        port=settings["MONGODB_PORT"]
        dbname=settings["MONGODB_DBNAME"]
        client=pymongo.MongoClient(port=port,host=host)
        tdb = client[dbname]
        self.post=tdb[settings["MONGODB_DOCNAME"]]
    def process_item(self,item,spider):
        info = dict(item)
        self.post.insert(info)
        return item

最後,是最主要的spider.py

 1 from scrapy.http import Request
 2 import scrapy
 3 from bs4 import BeautifulSoup
 4 import re
 5 import requests
 6 """
 7     spider腳本
 8 """
 9 class Myspider(scrapy.Spider):
10     name = 'anjuke_gz'
11     allowed_domains = ['http://gz.fang.anjuke.com/loupan/']
12     start_urls = ["http://gz.fang.anjuke.com/loupan/all/p{}/".format(i) for i in range(39)]
13 
14     def parse(self, response):
15         soup = BeautifulSoup(response.text,"lxml")
16         content=soup.find_all(class_="items-name") #返回每個樓盤的對應數據
17         for item in content:
18             code=item["href"].split("/")[-1][:6]
19             real_href="http://gz.fang.anjuke.com/loupan/canshu-{}.html?from=loupan_tab".format(code) #拼湊出樓盤詳情頁的url
20             res=requests.get(real_href)
21             soup = BeautifulSoup(res.text,"lxml")
22             a = re.findall(r'<div class="name">(.*?)</div>', str(soup))
23             b = soup.find_all(class_="des")
24             data = {}
25             for (i, j) in zip(range(len(b)), a):
26                 data[j] = b[i].text.strip().strip("\t")
27                 data["url"] = real_href
28             yield data

下麵是存入mongodb的情況。

  因為針對不同的網頁結構,爬取的規則是一個,所以爬取的時候就不能針對每個欄位進行爬取,所以存到庫里的數據如果要是分析的話還需要清洗。

在python中使用mongodb的查詢語句,再配合使用pandas應該就很方便清洗了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上面的代碼是段合法的cpp代碼嗎? 答案當然是是的. 這些 問號 是個什麼鬼?它們就是cpp標準中定義的 "Trigraph(MS)" .之所以出現這些神奇的符號,主因主要是字元集的問題.簡單來說可以理解為某些老外的鍵盤沒有"{","|","\"這些符號.所以需要用這種類似"轉義字元"的東東來表達c ...
  • KMP演算法是字元串模式匹配當中最經典的演算法,原來大二學數據結構的有講,但是當時只是記住了原理,但不知道代碼實現,今天終於是完成了KMP的代碼實現。原理KMP的原理其實很簡單,給定一個字元串和一個模式串,然後找模式串在給定字元串中的位置。將兩個字元串轉換為字元數組,然後從兩個數組的開始位置"i","j ...
  • Error Handling with Exceptions ___ The ideal time to catch an error is at compile time, before you even try to run the program. The rest of the proble ...
  • 今天跑程式的時候莫名其妙的出現了下麵的一個異常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforCangra.setSubDate([Ljava.lang.String;) 這類異常信息在以前是處理過的 ...
  • 本節我們介紹如何在Java中以二進位位元組的方式來處理文件,介紹主要的流,包括它們的功能、用法、原理和使用場景,最後,我們總結一些簡單的實用方法。 ...
  • 伺服器端:server_server.py 伺服器端:user_users.py 客戶端:server_client.py ...
  • bin目錄: lib目錄: common.py src目錄: users_business.py admin_business.py Story_start.py ...
  • 一,作業要求 開發簡單的FTP 1,用戶登錄 2,上傳/下載文件 3,不同用戶家目錄不同 4,查看當前目錄下文件 5,充分使用面向對象 二,程式文件清單 ![屏幕快照 2016 12 12 下午5.07.08.png 69.3kB][1] Folder目錄:用戶上傳文件家目錄 db目錄:伺服器端的用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...