使用xpath解析爬取鏈家

2021-10-24 08:44:59 字數 4108 閱讀 1783

from urllib import request

from time import sleep

from lxml import etree

import csv

import redis

import re

# 1 資料抓取

# 定義乙個函式,用於將頁碼,城市等資訊轉化為乙個request物件

defrequest_from

(url,page,city)

:# 請求頭

headers =

# 拼接url

page_url = url %

(city,page)

# 建立請求物件

return request.request(url=page_url,headers=headers)

# 定義乙個函式,抓取頁面資訊(根據城市名,起始頁和終止頁)

deffetch_pages

(url,city,start,end)

:for page in

range

(int

(start)

,int

(end)+1

):# 建立請求物件

req=request_from(url=url,city=city,page=page)

# 發起請求

res=request.urlopen(req)

# 將res中的響應體讀取處理,並且放入生成器中

# sleep(1)

# print(res.read()) #測試能不能獲取頁面

# sleep(1)

yield res.read(

).decode(

'utf-8'

)# 2 資料的解析

defanalysis_pages

(pages)

:for page in pages:

# 把每個html頁面建立出乙個節點樹

page_tree = etree.html(page)

#將html字串轉化成節點樹

hoose_list = page_tree.xpath(

"//li[starts-with(@class,'clear')]"

)# print(hoose_list)

for house in hoose_list:

#建立乙個字典,用於整合每個房屋的具體資訊

item =

# 標題

item[

'tiele'

]= house.xpath(

".//div[@class='title']//a/text()")[

0]# 房屋資訊

item[

'houseinfo']=

"".join(house.xpath(

".//div[@class='houseinfo']//text()"))

# 位址資訊

item[

'positioninfo']=

"".join(house.xpath(

".//div[@class='positioninfo']//text()"))

# 單價

item[

'unitprice'

]= re.findall(pattern=r"\d+"

,string=house.xpath(

".//div[@class='unitprice']//text()")[

0])[

0]# 總價

item[

'totalprice'

]= house.xpath(

".//div[@class='totalprice']//span/text()")[

0]# 鏈結

item[

'picurl'

]= house.xpath(

".//img[@class='lj-lazy']/@data-original")[

0]# print(item)

yield item

# 3 資料的儲存

defwrite_to_csv

(data)

:#開啟乙個csv**檔案

fp =

open

('ershoufang.csv'

,'a+'

,newline='')

#用追加的方式開啟

#建立乙個csv的寫物件

writer = csv.writer(fp)

writer.writerow(

['title'

,'houseinfo'

,'positioninfo'

,'unitprice'

,'totalprice'

,'picurl'])

# 寫內容

('請輸入城市的代號:'

) start =

input

('請輸入起始頁碼:'

) end =

input

('請輸入終止頁碼:'

) pages = fetch_pages(url=url,city=city,start=start,end=end)

house_list = analysis_pages(pages)

write_to_csv(house_list)

在第三步儲存資料中加入乙個函式,同時匯入一下json模組

# 儲存到redis資料庫

defwrite_to_redis

(data)

:#建立乙個redis鏈結 主機名 埠號 資料庫

rds = redis.strictredis(host=

'127.0.0.1'

,port=

6379

,db=6)

for house in data:

rds.lpush(

'ershoufang'

,json.dumps(house)

)

# 最後在 if __name__ == '__main__':下還要加入

先安裝redis資料庫,再安裝視覺化工具

安裝按照預設步驟一步步來即可

安裝完後,可在終端輸入命令檢視

redis-server

redis-cli

建立乙個redis資料庫

執行.py檔案然後檢視redis

可以發現資料存入進來了

順帶一提,爬取鏈家中北京的資源時會出現一些bug,某一段的資料會有大量重複

追加測試

'''

需求報告:

爬取以下城市:北京、上海、深圳、廣州、天津、武漢、杭州、成都、西安、鄭州

爬取的資料:標題、位置資訊、房屋資訊、單價、總價

儲存資料都存到一張csv表中屬性有:title、city、positioninfo、houseinfo、unitprice、totalprice

'''

使用Scrapy框架爬取鏈家資料

coding utf 8 import scrapy from pachong6.items import pachong6item class lianjiaspider scrapy.spider name lianjia allowed domains m.lianjia.com start ...

Python爬取鏈家房價資訊

房子問題近些年來越來越受到大家的關注,要了解近些年的房價,首先就要獲取網上的房價資訊,我們以鏈家網上 的房價資訊為例,將資料爬取下來並儲存起來。這次資訊的爬取我們依然採取requests beautiful soup的線路來爬取鏈家網上的 房的資訊。需要安裝好anaconda,並保證系統中已經有re...

爬取鏈家網房價資料

感覺最近做的東西好菜 隨便了。d 鏈家房價資料.csv wt newline encoding utf8 writer csv.writer fp writer.writerow 樓盤名 位址 房間格式 房間面積 起價 優點 defget html url try response requests...