scrapy-講解
xpath選取節點常用的標簽元素如下,
| 標記 | 描述 |
|---|---|
| extract | 提取內容轉換為Unicode字串,回傳資料型別為list |
| / | 從根節點選取 |
| // | 匹配選擇的當前節點選擇檔案中的節點 |
| . | 節點 |
| @ | 屬性 |
| * | 任何元素節點 |
| @* | 任何屬性節點 |
| node() | 任何型別的節點 |
爬取房天下-前奏
分析
1、網址:url:https://sh.newhouse.fang.com/house/s/,
2、確定爬取哪些資料:1)網頁地址:page,2)所在位置名稱:name,3)價格:price,4)地址:address,5)電話號碼:tel
2、對網頁進行分析,

打開url后,可以看到我們需要的資料,然后可以看下面還是有分頁的,

可以看到打開url后查看網頁元素,我們所要的資料都在一對ul標簽內,


打開li一對標簽,我們需要的name是在a標簽下面的,而且在文本左右有不清楚的空格換行等需要特殊處理,
我們需要的price是在55000標簽下面,注意,有的房子被買完了就沒有價格顯示,這個坑小心踩了,
一次類推我們可以找到對應的address和tel,

分頁標簽元素可以看到,當前頁面的的a的class="active",在打開主頁面是a的文本是1,表示第一頁,
爬取房天下-前具體實作程序
先新建scrapy專案
1)切換到專案檔案夾:Terminal控制臺上面輸入 scrapy startproject hotel,hotel是演示的專案名稱,可以根據自己需要自定義,
2)根據需要在items.py檔案夾下配置引數,在分析中可知需要用到五個引數,分別是:page,name,price,address,tel,配置代碼如下:
class HotelItem(scrapy.Item):
# 這里的引數要與爬蟲實作的具體引數一一對應
page = scrapy.Field()
name = scrapy.Field()
price = scrapy.Field()
address = scrapy.Field()
tel = scrapy.Field()
3)新建我們的爬蟲分支,切換到spiders檔案夾,Terminal控制臺上面輸入 scrapy genspider house sh.newhouse.fang.comhouse是專案的爬蟲名稱,可以自定義,sh.newhouse.fang.com是爬取的區域選擇,
在spider檔案夾下面就有我們創建的house.py檔案了,
代碼實作與解釋如下
import scrapy
from ..items import *
class HouseSpider(scrapy.Spider):
name = 'house'
# 爬取區域限制
allowed_domains = ['sh.newhouse.fang.com']
# 爬取的主頁面
start_urls = ['https://sh.newhouse.fang.com/house/s/',]
def start_requests(self):
for url in self.start_urls:
# 回掉函式傳的模塊名稱,沒有括號,這是一種約定,
yield scrapy.Request(url=url,callback=self.parse)
def parse(self, response):
items = []
# 獲取當前頁面顯示的值
for p in response.xpath('//a[@class="active"]/text()'):
# extract使提取內容轉換為Unicode字串,回傳資料型別為list
currentpage=p.extract()
# 確定最后一頁
for last in response.xpath('//a[@class="last"]/text()'):
lastpage=last.extract()
# 切換到最近一層的標簽,//從匹配選擇的當前節點選擇檔案中的節點,而不考慮它們的位置 /從根節點選取
for each in response.xpath('//div[@class="nl_con clearfix"]/ul/li/div[@class="clearfix"]/div[@class="nlc_details"]'):
item=HotelItem()
# 名稱
name=each.xpath('//div[@class="house_value clearfix"]/div[@class="nlcd_name"]/a/text()').extract()
# 價格
price=each.xpath('//div[@class="nhouse_price"]/span/text()').extract()
# 地址
address=each.xpath('//div[@class="relative_message clearfix"]/div[@class="address"]/a/@title').extract()
# 電話
tel=each.xpath('//div[@class="relative_message clearfix"]/div[@class="tel"]/p/text()').extract()
# 所有item里面引數要與我們items里面引數意義對應
item['name'] = [n.replace(' ', '').replace("\n", "").replace("\t", "").replace("\r", "") for n in name]
item['price'] = [p for p in price]
item['address'] = [a for a in address]
item['tel'] = [s for s in tel]
item['page'] = ['https://sh.newhouse.fang.com/house/s/b9'+(str)(eval(p.extract())+1)+'/?ctm=1.sh.xf_search.page.2']
items.append(item)
print(item)
# 當爬取到最后一頁,類標簽last就自動切換成首頁
if lastpage=='首頁':
pass
else:
# 如果不是最后一頁,繼續爬取下一頁資料,知道爬完所有資料
yield scrapy.Request(url='https://sh.newhouse.fang.com/house/s/b9'+(str)(eval(currentpage)+1)+'/?ctm=1.sh.xf_search.page.2', callback=self.parse)
4)在spiders下運行爬蟲,Terminal控制臺上面輸入 scrapy crawl house,
結果如下圖所示

整體專案結構如右圖tts檔案夾是我這邊用于存盤資料的的txt檔案,本專案里面可以不需要,

如有發現錯誤請聯系微信:sunyong8860
python的路上爬著前行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/206271.html
標籤:其他
上一篇:小趙講堂系列1-特征工程這件小事
