初識Scrapy框架+爬蟲實戰(7)-爬取鏈家網100頁租房信息

Scrapy簡介

Scrapy,Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。Scrapy吸引人的地方在於它是一個框架,任何人均可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持。css

Scrapy項目結構

scrapy.cfg: 項目的配置文件 lianjia/: 該項目的python模塊。以後您將在此加入代碼。 lianjia/items.py: 項目中的item文件. lianjia/pipelines.py: 項目中的pipelines文件. lianjia/settings.py: 項目的設置文件. lianjia/spiders/: 放置spider代碼的目錄.python

下面主要說一下幾個比較重要的: item.pyweb

Item 是保存爬取到的數據的容器。好比我下面將要爬取的鏈家網租房信息的地點、平米數、價格,我會在item.py文件中定義相應的字段。正則表達式

from scrapy import  Item,Field

class LianjiaItem(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    place=Field()    #爬取鏈家租房信息的-地點
    size=Field()     #爬取鏈家租房信息的-房屋平米數
    price = Field()  # 爬取鏈家租房信息的-價格
複製代碼

spider.py 此文件是咱們在spiders文件下本身建立的,用來寫爬蟲的代碼的,很是重要。 咱們須要建立一個Spider,必須繼承scrapy.Spider,並有下面三個屬性:shell

name: 用於區別Spider。 該名字必須是惟一的,您不能夠爲不一樣的Spider設定相同的名字。 start_urls: 包含了Spider在啓動時進行爬取的url列表。 所以,第一個被獲取到的頁面將是其中之一。 後續的URL則從初始的URL獲取到的數據中提取。 parse() 是spider的一個方法。 被調用時,每一個初始URL完成下載後生成的 Response 對象將會做爲惟一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成須要進一步處理的URL的 Request 對象。 pipelines.py 主要做用是爲爬取下的數據的作處理。好比txt或者存入數據庫的操做。 settings.py 主要是對爬蟲項目的設置數據庫

Scrapy框架爬蟲實戰

今天主要爬取一下鏈家網租房主頁的前一百頁數據,也是爲了帶你們去入門熟悉一下Scrapy框架。windows

建立項目

命令行切換到你想建立Scrapy項目的路徑,我是在D盤pycharm文件夾建立的 輸入:瀏覽器

scrapy startproject 項目名稱
複製代碼

而後咱們用PyCharm導入:File-->Open bash

爬取鏈家網詳解

1.編寫item.py,定義爬取的字段。咱們爬取鏈家網條目的租房地點、平米數以及價位,因此定義三個字段,代碼以下:微信

from scrapy import  Item,Field

class LianjiaItem(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    place=Field()    #爬取鏈家租房信息的-地點
    size=Field()     #爬取鏈家租房信息的-房屋平米數
    price = Field()  # 爬取鏈家租房信息的-價格

    pass
複製代碼

2.在spiders文件夾下建立spider.py,用來爬取代碼。代碼以下:

import scrapy
from scrapy.http import Request
from lianjia.items import LianjiaItem

class LianjiaSpider(scrapy.Spider):#必須繼承scrapy.Spider

    name = "lianjia"   #名稱
    start_urls = ['https://tj.lianjia.com/zufang/']   #URL列表


    def parse(self, response):
        item=LianjiaItem()

        infos=response.xpath('//div[@class="info-panel"]')

        for info  in infos:
            # 獲取地點
            place = info.xpath('div/div/a[@class="laisuzhou"]/span/text()').extract()[0].replace('\xa0','')
            # 獲取平米數
            size = info.xpath('div/div/span[@class="meters"]/text()').extract()[0].replace('\xa0','')
            # 獲取價格
            price = info.xpath('div/div[@class="price"]/span/text()').extract()[0] + info.xpath(
                'div/div[@class="price"]/text()').extract()[0]

            item['place']=place
            item['size'] = size
            item['price'] = price

            yield  item   #返回數據

        #重新設置URL,從第2頁到第100頁 回調parse方法
        for i in   range(2,101):
            url = 'https://tj.lianjia.com/zufang/pg{}/'.format(str(i))
            yield Request(url, callback=self.parse)  ## 回調
複製代碼

經過代碼咱們會發現,Item字段是經過Selector選擇器提取的。 它有四個基本的方法:

xpath(): 傳入xpath表達式,返回該表達式所對應的全部節點的selector list列表 。 css(): 傳入CSS表達式,返回該表達式所對應的全部節點的selector list列表. **extract(): **序列化該節點爲unicode字符串並返回list。 re(): 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。

另外也能夠在Shell中調試xpath等,具體的操做在下面,慢慢看。

3.txt形式存儲 pipelines.py就是對爬取下的數據作處理的,因此咱們能夠在此文件中寫txt或者數據庫存儲等等,今天就以TXT存儲爲例:

class LianjiaPipeline(object):

    def process_item(self, item, spider):
        try:
            place = str(item['place'])
            size = str(item['size'])
            price = str(item['price'])
            fb = open("C:/Users/qzs/Desktop/qinzishuai.txt", "a+")
            fb.write(place + size + price + '\n')
            fb.close()
        except:
            pass

        return item
複製代碼

另外還須要在settings.py中配置一下,名稱必定要換成你的項目名稱:

ITEM_PIPELINES = {
    'lianjia.pipelines.LianjiaPipeline': 300,    #保存到txt文件
}
複製代碼

4.運行 運行scrapy項目兩種方式: (1).在Terminal輸入命令運行,也就是在項目路徑的命令行輸入:

scrapy crawl 項目名稱
複製代碼

(2).在Pycharm中運行。咱們要在scrapy.cfg同層目錄下建一個begin.py文件,輸入代碼:

from scrapy import cmdline

cmdline.execute("scrapy crawl lianjia".split())
複製代碼

而後再點擊Run-->Edit Configurations...

而後咱們就能夠運行了。 **強調:**第一次運行的時候,我遇到no module named win32API錯誤,這是由於Python沒有自帶訪問windows系統API的庫的,須要下載第三方庫。

直接在pip安裝便可:

pip install pypiwin32
複製代碼

安裝完成後運行成功,查看TXT:

Scrapy Shell調試xpath

快捷命令:

shelp() - 打印可用對象及快捷命令的幫助列表 fetch(request_or_url) - 根據給定的請求(request)或URL獲取一個新的response,並更新相關的對象 view(response) - 在本機的瀏覽器打開給定的response。 其會在response的body中添加一個  tag ,使得外部連接(例如圖片及css)能正確顯示。 注意,該操做會在本地建立一個臨時文件,且該文件不會被自動刪除。

在命令行輸入:

scrapy shell "爬取的URL"
複製代碼

而後會顯示你能內容以下,說明成功進入shell:

下面主要說一下response.xpath調試,爲了判斷咱們的xpath是否正確。 例如咱們想調試一下鏈家網租房的地點信息,輸入:

response.xpath('//div/div/a[@class="laisuzhou"]/span/text()').extract()
複製代碼

結果顯示:

說明咱們的xpath沒有問題。 再能夠輸入:

view.(response)
複製代碼

效果以下:


但願對你們有所幫助! 你們能夠關注個人微信公衆號:「秦子帥」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索