目標:
爬出房源的名字、價格、地址和url
需要爬取的數據
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
FANGJIA_ADDRESS = scrapy.Field() # 住房地址
FANGJIA_NAME = scrapy.Field() # 名字
FANGJIA_PRICE = scrapy.Field() # 房價
FANGJIA_URL = scrapy.Field() # 房源url
目標城市
http://hz.lianjia.com/
或者新樓盤:
http://hz.fang.lianjia.com/loupan/nht1/
分析網頁源碼
先抓取url,再進入具體網頁抓取想要的數據。
href="http://hz.fang.lianjia.com/" ><span>新房</span>
XPATH抓取上面a 標簽中的href
抓取一個頁面的所有的url集合,遍歷上面的集合,請求具體頁面
fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()
代碼如下:(PS:類名字使用之前豆瓣,忽視之)
import scrapy
from tutorial.items import TutorialItem
from scrapy.selector import Selector
from scrapy.http import Request
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
class Douban(scrapy.Spider):
name = "fangjia"
allowed_domins = ["http://hz.fang.lianjia.com/"]
start_urls = []
def start_requests(self):
global headers
urlhead = 'http://hz.fang.lianjia.com/loupan/'
for i in range(18):
url = urlhead+'pg%snht1' % i
self.start_urls.append(url)
for url in self.start_urls:
print (url)
yield scrapy.Request(url, headers=headers, callback=self.parse)
def parse(self, response):
global headers
fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()
if fang_links:
for fang_link in fang_links:
url = 'http://hz.fang.lianjia.com'+fang_link
yield scrapy.Request(url, headers=headers, callback=self.parse_fangjia)
def parse_fangjia(self, response):
item = TutorialItem()
name = response.xpath('//div[@class="name-box"]/a/@title').extract()[0]
url = response.xpath('//div[@class="name-box"]/a/@href').extract()[0]
price = response.xpath('//p[@class="jiage"]/span[@class="junjia"]/text()').extract()[0]
address = response.xpath('//p[@class="where"]/span/@title').extract()[0]
item['FANGJIA_NAME'] = name
item['FANGJIA_ADDRESS'] = address
item['FANGJIA_PRICE'] = price
item['FANGJIA_URL'] = 'http://hz.fang.lianjia.com'+url
print (item['FANGJIA_NAME'])
print (item['FANGJIA_ADDRESS'])
print (item['FANGJIA_PRICE'])
print (item['FANGJIA_URL'])
yield item
爬蟲代碼說明:
allowed_domins 可選。包含了spider允許爬取的域名(domain)列表(list)。
name 定義spider名字的字符串(string)。
start_urls URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 因此,第一個被獲取到的頁面的URL將是該列表之一。
start_requests() 該方法必須返回一個可迭代對象(iterable)。該對象包含了spider用于爬取的第一個Request。當spider啟動爬取并且未制定URL時,該方法被調用。 當指定了URL時,make_requests_from_url() 將被調用來創建Request對象。 該方法僅僅會被Scrapy調用一次,因此您可以將其實現為生成器。
該方法的默認實現是使用 start_urls 的url生成Request。
如果您想要修改最初爬取某個網站的Request對象,您可以重寫(override)該方法。
本例中該函數主要是獲取start_urls列。然后每個url都調用parse函數。
for url in self.start_urls:
print (url)
yield scrapy.Request(url, headers=headers, callback=self.parse)
parse(response)
當response沒有指定回調函數時,該方法是Scrapy處理下載的response的默認方法。
parse 負責處理response并返回處理的數據以及(/或)跟進的URL。 Spider 對其他的Request的回調函數也有相同的要求。該方法及其他的Request回調函數必須返回一個包含 Request 及(或) Item 的可迭代的對象。
本例中,主要是處理每個URL,拼接URL,然后調用parse_fangjia函數。
parse_fangjia函數
該函數是真實爬取的主函數,從最后拼接的URL中獲取名字、地址、加個和URL,并輸出。
總體過程小總,首先框架調用由start_requests函數,生成需要爬的初始URL,18個,
然后18次循環,每次循環中每個URL觸發parse函數,將所爬URL中的URL提取出來并拼接形成新的URL組。然后再次循環遍歷新的URL組中URL,調用parse_fangjia函數。
爬蟲
保存成CSV格式
#scrapy crawl ganglia -o ganglia.csv -t csv
Safari顯示網頁源碼:
新版的Safari在菜單欄里看不到“查看網頁源碼”的菜單了
點擊Safari菜單欄,選擇“偏好設置”
在彈出來的窗口中,選擇 “高級”頁簽,勾選 “在菜單欄里顯示開發菜單”
回到要查看源碼的頁面,點擊上方開發菜單
新聞熱點
疑難解答