一、爬蟲–scrapy
1.搭建環境
代碼如下(示例):
import scrapy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2.加載scrapy框架
代碼如下(示例):
# terminal 終端實作
cd .. # 跳轉到上一層目錄
scrapy startproject booktop # 和專案同名的scrapy框架專案
3. setting配置
代碼如下(示例):
ROBOTSTXT_OBEY = False # 君子協議 false 不遵守
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
DOWNLOAD_DELAY = 0.5 # 下載延遲
4.spider撰寫
代碼如下(示例):
# spiders檔案夾下創建python檔案 ganspider.py
import scrapy
from demo6.items import HouseItem
class GanJiSpider(scrapy.Spider):
name="gan_spider"
allowed_domains=["xiangyang.ganji.com"]
start_urls=["http://xiangyang.ganji.com/zufang/"]
# 決議資料
def parse(self, response, **kwargs):
# print(response.text)
測驗
代碼如下(示例):
# 在terminal終端進行
cd gandemo # 進入專案檔案夾
scrapy crawl gan_spider # 運行專案下的爬蟲(和name的值保持一致)
# 測驗成功,看到頁面代碼
5. 獲取資料(戶型+價格)
代碼如下(示例):
# 需要匯入HouseItem類 檔案開頭匯入 from demo6.items import HouseItem
from demo6.items import HouseItem
class HouseSpider(scrapy.Spider):
name="house_spider"
allowed_domains=["xiangyang.ganji.com"]
start_urls=["http://xiangyang.ganji.com/zufang/"]
# 決議資料
def parse(self, response, **kwargs):
# 所有的房子
houses=response.css('dl.f-list-item-wrap.min-line-height.f-clear')
# 戶型 價格
for house in houses:
size=house.css('dd.dd-item.size span:first-child::text').extract()
[0]
# print(size)
price=house.css('div.price span.num::text').extract()[0]
# print(price)
yield HouseItem(size=size,price=price)
需要使用item物件完成資料封裝并傳輸
代碼如下(示例):
# items.py書寫房屋類
class HouseItem(scrapy.Item):
size=scrapy.Field()
price=scrapy.Field()
pass
6.pipeline 管道存盤資料
代碼如下(示例):
# 在setting檔案下,解開注釋
ITEM_PIPELINES = {
'booktop.pipelines.HousePipeline': 300,
}
#資料存盤到txt檔案下
# 打開管道檔案 BooktopPipeline
class HousePipeline:
def process_item(self, item, spider):
file=open('house.txt','a+',encoding='utf-8')
file.write( item['size']+','+item['price']+'\n')
return item
# 運行測驗結果house.txt下有資料成功
二、分析和可視化
代碼如下(示例):
# 在專案中創建 分析檔案 demo.py
import pandas as pd
import matplotlib.pyplot as plt
# 資料源
data=pd.read_csv('house.txt',names=['size','price'])
print(data)
# 統計groupby不同戶型的最高價max,最低價min,均價mean,
result=data.groupby('size').agg(['max','min','mean'])
print(result)
# 繪制不同戶型均價折線圖、柱狀圖
import matplotlib
# 中文可顯示
font = {'family': 'microsoft yahei',
'weight': 'bold',
'size': 12}
matplotlib.rc('font', **font)
plt.title('不同戶型房源示意圖')
# 折線圖 柱狀圖
plt.plot(result.index,result['price']['mean'],'r*--')
plt.bar(result.index,result['price']['mean'])
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236591.html
標籤:python
