如何爬取網頁表格數據?

想從鳳凰指數上爬去今年杭州商品房日成交數據,網址10.27鳳凰指數:房博會現場成交325套 參展盤數據失色 ——鳳凰房產杭州。目前能用python爬取單個頁面,但不知如何提取出表格內容,以及如何循環到其他頁面爬取,請高手指教。

之前試過excel網站數據讀取,但是只能讀單頁面,有會vba的朋友也請給點建議


呵呵,這個我是專家,來不請自答
我以前碰到過一個項目,是從一個網站下載100w張網頁,100w網頁的表格格式是一致的,再從這100w網頁中提取數據,項目上繳的文件是access資料庫
哥用了以下的工具來實現:

  1. 用offline explorer來批量下載網頁
  2. 用LAMP環境把網頁發布
  3. 用火車頭軟體建立網頁提取規則,從網頁中提取數據
  4. 100w的網頁,項目半個月,兩台電腦沒有停歇過

為什麼會邀請我回答這麼古早的問題。。。

require(rvest)
require(magrittr)
url &<- "http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml" content &<- read_html(url) trade &<- html_table(content, header = TRUE)[[1]] trade &<- set_colnames(trade[-1, ], trade[1, ]) # 做一些規整 # 獲取總頁數,用以構建新的爬取網頁目標 page_count &<- html_nodes(content, "#news_detail_page") %&>%
html_attr("page-count")


我用R語言來實現這個:

library(XML)
url&<-"http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml" tbls&<-readHTMLTable tbls&<-readHTMLTable(url) sapply(tbls,nrow) pop&<-readHTMLTable(url,which = 1) write.csv(pop,file="F:/pop.csv")

最終爬取的數據,用excel打開。

打開後是這樣:


直接用pandas啊,簡單方便

import pandas as pd
data =pd.read_html(url)[0]


推薦你用一軟爬蟲軟體,GooSeeker,http://www.gooseeker.com
1.比火車頭好用,火車頭好貴。
2.如果你要的數據量特別大的話,可以在社區上尋求幫助
3.其實你的要求真的很容易實現。。


我爬了你說的那個網頁,講講我遇到的問題:
1.你說的循環爬取其他頁面,在其他項目中用循環一般可以搞定,可是你的這個,第一頁和第二第三頁的表格是不同的,所以要重新寫規則,我懶,寫了第一頁後,就不想在寫第二第三頁了;
2.亂碼問題,我用request爬取,遇到了亂碼,後來強制改為utf-8解決了;
其他也沒什麼了,詳見python爬蟲:爬取鳳凰指數
我也剛學爬蟲,求輕噴O(∩_∩)O~


推薦一個免費的網頁數據採集器吧,爬一爬 http://www.pa1pa.com,寫爬蟲畢竟費時費力,簡單的任務用這樣的採集器會比較方便。表單數據,翻頁什麼的都可以解決。數據也是直接excel下載。


抓取表格數據,對於爬山虎採集來說太簡單了。

直接一步搞定,爬山虎採集器內置了自動分析網頁結構的演算法,直接一鍵採集

而且,還能夠自動匹配分頁,支持多級頁面採集。

簡單易用,小白用戶,也能快速採集數據。

測試了下題主的網頁,效果如下:


很多library都可以實現題主想要的功能,列出來題主去查一下官方的documentation肯定就會用。
如 @komari kamikita提到的,有beautifulsoup4,同樣的還有pyquery,都可以抓靜態數據
如果以後抓取網頁碰到動態載入的數據,可以考慮使用 phantomjs
如果想更暴力直接開出一個有界面的瀏覽器做各式各樣的操作,達到ajax無阻礙的,可以用Selenium + Beautifulsoup
等等等,google下一大把


小白來答一發,代碼寫的爛請多多包涵。

import requests
from bs4 import BeautifulSoup

def get_data( page ):
url = "http://hz.house.ifeng.com/detail/2014_10_28/50087618_%s.shtml" %str(page)
req = requests.get(url)
page = req.content.decode("utf-8")

soup = BeautifulSoup(page,"lxml")
data = soup.select("body &> div.contentv2.w1180.clearfix &> div.wdetailbox.ctltbox &> div &> div.article &> table &> tbody &> tr ")
for line in data:

for d in line.find_all("td"):
print(d.text)

print("**********************************")

get_data(1)

使用requests + BeautifulSoup 使用簡單。

想要爬取第幾頁就更改get_data()內的數字。

內容為一行一行輸出,需要存入excel或者資料庫稍微改下代碼。


小白一枚,我使用requests+re的路線,抓取了一頁數據,後面兩頁數據格式又略有區別,可參考代碼作相應改動

import requests
import re
import pandas as pd

#使用requests獲取網頁信息
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""

#使用正則表達式提取目標信息
def parsePage(ilt,html):
try:
plt=re.findall("&

.*?&",html)
l=len(plt)
l=l//7
for i in range(l):
j=i*7
num=plt[j].split("">")[1].split("&<")[0] name=plt[j+1].split("">")[1].split("&<")[0] loc=plt[j+2].split("nbsp;")[1].split("&<")[0] signNum=plt[j+3].split("">")[1].split("&<")[0] bookNum=plt[j+4].split("">")[1].split("&<")[0] area=plt[j+5].split("">")[1].split("&<")[0].replace("nbsp;", "") avePrice=plt[j+6].split("">")[1].split("&<")[0] ilt.append([num,name,loc,signNum,bookNum,area,avePrice]) except: return "" #保存為csv文件 def saveGoodslist(ilt): pd.DataFrame(ilt).to_csv("housing_transcation.csv",index=False,header=False) def main(): infolist=[] infolist.append([ "序號","樓盤名稱","城區","簽約套數","預定套數","簽約面積","簽約均價"]) url="http://hz.house.ifeng.com/detail/2014_10_28/50087618_1.shtml" html=getHTMLText(url) parsePage(infolist,html) saveGoodslist(infolist) main()

推薦閱讀:

TAG:Python | 數據分析 | MicrosoftExcel | 爬蟲計算機網路 | R編程語言 |