Python實現爬蟲(爬取58同城所有房價)
程序發布日期2018-9-25(如果以后不能使用了,就需要更改解析方式.)
github博客傳送門
csdn博客傳送門
爬蟲文件(Python實現)-爬取的數據文件(txt文件,空格分隔)-分析的文件(Python實現)-簡單的分析結果圖(png圖4張) 資源鏈接地址:https://download.csdn.net/download/zhanghao3389/10686953
本章所需知識:
- 熟悉urllib.request模塊(本次使用的是Python3,Python2請使用urllib和request兩個模塊)
- urllib.request.urlopen() # 打開一個http請求
- read() # 返回的信息中的.read()方法
- 熟悉lxml中的etree模塊
- etree.HTML() # 將html轉換成能解析的格式
- xpath的使用
- 由於我還沒寫xpath筆記所以參照菜鳥教程:http://www.runoob.com/xpath/xpath-syntax.html
- 文件操作
- 點到為止,打開一個文件 寫入 關閉即可. 參考:https://blog.csdn.net/zhanghao3389/article/details/82386935
- 函數
- 時間模塊
- 暫停的一個方法即可 time.sleep() 參照:https://blog.csdn.net/zhanghao3389/article/details/82589809
分析頁面鏈接(pandas+numpy+matplotlib):https://blog.csdn.net/zhanghao3389/article/details/82845263
接下來上代碼:
import urllib.request # 打開網頁,讀取網頁內容用
from lxml import etree # 解析網頁用
import time # 這里只使用了暫停程序的作用
url = 'https://cd.58.com/ershoufang/pn{}' # 需要解析的網頁
# 定義了一個獲取網頁的方法 (http請求)
def getHtml(url):
response = urllib.request.urlopen(url) # 打開獲取的鏈接
print(response.getcode()) # 返回一個網頁打開的狀態碼
html = response.read() # 將獲取的網頁寫入html
return html # 返回給調用者
# 定義了一個解析網頁的方法 (解析器)
def parserHtml(html): # 將一個下載好的html傳入解析器
html_text = etree.HTML(html) # 將html轉換成xpath可以解析的格式
message_list = html_text.xpath('/html/body/div[5]/div[5]/div[1]/ul/li') # 解析到每個li元素的位置
for message in message_list: # 遍歷所有的li元素
region = message.xpath('./div[2]/p[2]/span/a[2]/text()') # 解析地理位置
price = message.xpath('./div[3]/p[1]/b/text()') # 解析房子的價格
company = message.xpath('./div[3]/p[1]/text()') # 解析房子的價格單位
area = message.xpath('./div[2]/p[1]/span[2]/text()') # 解析房子的面積
unit_price = message.xpath('./div[3]/p[2]/text()') # 解析房子的單價
area = area[0].strip() # 將房子的面積后的空格去掉(房子的面積參數后面有個 html的空格 跟我們寫入的格式不一樣所以必須去掉才能寫入到本地)
b = '{0} {1} {2} {3}' # 占位符(將每個數據中間添加一個空格隔開,便於后續導入excel)
a = b.format(region[0], price[0] + company[0], area, unit_price[0]) # 將爬取的數據格式化
print(a) # 打印出格式化后的數據
with open('message.txt', 'a') as f: # 打開一個文件存入格式化后的文件
f.write(str(a)) # 將數據寫入文件
f.write('\n') # 寫入一個換行符
# 主函數
for i in range(1, 70): # 遍歷69次(看了一下網站 大概只有70頁 為了不增加程序難度 手動翻69次)
print('第{}頁'.format(i)) # 打印正在爬取第幾頁
url1 = url.format(i) # 將url格式化 傳入頁數
html = getHtml(url1) # 下載html (將格式化好的url1傳入 getHtml 方法中)
parserHtml(html) # 解析html (將下載好的 html 傳入 parserHtml 方法中解析)
time.sleep(1) # 暫停一秒 (有時候有檢測會封 ip 然后將暫停時間調大一點 手動進入瀏覽器將驗證碼輸入一遍就可以重新爬取了.
分析頁面鏈接(pandas+numpy+matplotlib):https://blog.csdn.net/zhanghao3389/article/details/82845263
程序運行狀態圖: