Scrapy,Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。Scrapy吸引人的地方在於它是一個框架,任何人均可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持。css
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框架。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:
快捷命令:
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)
複製代碼
效果以下:
但願對你們有所幫助! 你們能夠關注個人微信公衆號:「秦子帥」一個有質量、有態度的公衆號!