1.爬蟲入門概述
爬蟲,又被稱爲網絡爬蟲,主要指代從互聯網上進行數據採集的腳本後者程序,是進行數據 分析和數據挖掘的基礎。
所謂爬蟲就是指在給定url(網址)中獲取我們對我們有用的數據信息,通過代碼實現數據的大量獲取,在經過後期的數據整理、計算等得出相關規律,以及行業趨勢等信息。
通常我們說的爬蟲
2.爬蟲分類
- 按照使用情況,主要分爲兩大類型:通用爬蟲和聚焦爬蟲
- 按照採集數據的過程進行區分又可分爲 積累爬蟲和增量爬蟲
2.1通用爬蟲&聚焦爬蟲
通用爬蟲:最常見的數據採集程序,是網絡上搜索引擎使用的腳本程序,搜索引擎通過通用爬蟲進行互聯網上的數據蒐集,提供給自己的客戶進行數據搜索使用;(缺點)通用爬蟲採集的數據具有普遍性、針對性較差;(優點)但是通用爬蟲的重用性較高,一旦開發調試完成、可以長時間運行給搜索引擎提供需要的數據。
聚焦爬蟲:是數據供應商企業使用最多的爬蟲程序,優點:通常情況針對指定範圍的數據進行定向的數據採集和篩選,能在一定時間段內最大限度的採集企業需要的有效的數據;缺點:但是重用性較差,一般針對不同的數據需求,需要獨立開發爬蟲程序進行數據採集。
2.2 積累爬蟲&增量爬蟲
積累爬蟲:目標數據一旦生成,不會發生改動,隨着時間的延伸數據量逐漸增大,累積爬蟲就是採集這樣的數據,採集並保存歷史數據,之後針對新生成的數據進一步獲取,採集過程中不會更新歷史數據;如採集期權股票的數據、房地產地域價格歷史數據等等.
增量爬蟲:目標數據在需求更改過程中,可能會隨時發生變化;歷史數據的變動和新增數據都被稱爲增量,所以針對此類數據採集的爬蟲程序,稱爲增量爬蟲;增量爬蟲的特點就是在採集數據的過程中隨時更新歷史數據的同時採集新增數據。如搜索引擎採集網絡數據,網絡上的網頁數據隨時可能發生變化,需要爬蟲針對採集的歷史數據隨時進行更新並採集新增的網頁數據。
3.爬蟲之優
爲什麼要使用爬蟲?
爬蟲的作用是從網站上採集(下載)數據的,目前市面上流行的下載工具比比皆是,使用爬蟲的優勢和使用場景的目的性一定要明確;
所以如果要下載一部電影?保存一張圖片?存儲一片論文?下載一本小說?下載一個網站 上所有網頁數據?不同的使用場景下到底怎樣操作纔是最有效率的做法,工欲善其事,在利其器之前我們首先要明確所善何事何時何地。
爬蟲的優勢是將下載數據的過程通過編寫的程序實現自動化批量處理,但是自動化有兩個前提條件:
- 需要編寫程序、
- 可以批量處理、
這兩個前提條件同樣也說明了爬蟲的使用場景
⚫ 採集數據之前,對目標數據進行分析,並編寫程序代碼
⚫ 目標數據是批量數據(非單個/極少量數據),批量數據有自己的組成規律
3.1爬蟲使用注意事項
爬蟲技術在一定程度上還是備受爭議的,尤其是聚焦爬蟲在數據處理過程中對於目標數據所在的服務器會造成短時間的壓力提升;爬蟲程序由於程序本身的特殊性,在一定程度上可能會引發一些對網站的惡意攻擊行爲;爬蟲採集數據的過程中對於數據的涉密性區分不是很嚴格,主要靠人工手段進行篩選操作;所以爬蟲處理過程中一定要注意如下問題:
- 爬蟲採集的目標數據量進行分析
- 爬蟲採集的目標數據涉密性進行分析
- 爬蟲採集目標數據的頻率進行分析
4.爬蟲入門程序
4.1爬蟲採集數據,主要採集網站數據,通 常情況下操作步驟如下:
⚫ 確定目標網站url地址
⚫ 對目標 url 地址發送請求
⚫ 獲取網站返回的響應數據
⚫ 對響應數據進行解析處理
⚫ 得到目標數據
4.2入門操作————自己嘗試一下吧
給定url http://finance.eastmoney.com/news/cgsxw_1.html
python3.6下的爬蟲程序 (ps:記得導入相應的模塊)
"""
Version 1.1.0
Author lkk
Email [email protected]
date 2018-11-19 14:10
DESC 獲取新聞網站的新聞
"""
from urllib import request
import re
from fake_useragent import UserAgent
import chardet
import pymysql
def parse():
ua = UserAgent()
headers = {'User-agent': ua.random} # 創建代理對象以及請求頭
url = 'http://finance.eastmoney.com/news/cgsxw_1.html' # 初始url
base = 'http://finance.eastmoney.com/news/' # 基礎url 獲取下一頁時3使用
start = request.Request(url, headers=headers)
response = request.urlopen(start)
content = response.read()
encoding = chardet.detect(content).get('encoding')
content = content.decode(encoding, 'ignore')
news = re.findall(r'<div[^>]+class="text\s+text-no-img">\s+(.*?)</div>', content, re.S) # 使用正則匹配我麼所需的數據
for jokes in news:
link = re.findall(r'<a\s+href="(.*?)"\s+target="_blank">', jokes)
title = re.findall(r'<a.*?>\s+(.*?)\s+</a>', jokes)
info = re.findall(r'<p[^>]+class="info".*?>\s+(.*?)\s+</p>', jokes)
times = re.findall(r'<p[^>]+class="time".*?>\s+(.*?)\s+</p>', jokes)
print(link, title, info, times)
next_page = re.findall(r'<a\s+href="(.*?)"\s+target="_self".*?>下一頁</a>', content)
print(next_page)
while True:
next_page = re.findall(r'25</a>\s*<a\s+href="(.*?)"\s+target="_self".*?>下一頁</a>', content)
print(next_page)
if len(next_page) <= 0:
print("數據採集完畢")
break
# 採集下一頁
next_content = request.Request(base + next_page[0], headers=headers)
response = request.urlopen(next_content)
content = response.read()
encoding = chardet.detect(content).get('encoding')
content = content.decode(encoding, 'ignore')
news = re.findall(r'<div[^>]+class="text\s+text-no-img">\s+(.*?)</div>', content, re.S)
for jokes in news:
link = re.findall(r'<a\s+href="(.*?)"\s+target="_blank">', jokes)
title = re.findall(r'<a.*?>\s+(.*?)\s+</a>', jokes)[0]
info = re.findall(r'<p[^>]+class="info".*?>\s+(.*?)\s+</p>', jokes)[0]
times = re.findall(r'<p[^>]+class="time".*?>\s+(.*?)\s+</p>', jokes)[0]
print(link[0], title, info, times)
mysql(link, title, info, times)
class DownMysql:
"""數據持久化存儲"""
def __init__(self, link, title, info, times):
self.link = link
self.title = title
self.info = info
self.times = times
self.connect = pymysql.connect(
host='localhost',
db='data', # 數據庫名
port=3306,
user='root',
passwd='123456', # 數據庫密碼
charset='utf8',
use_unicode=False
)
self.cursor = self.connect.cursor()
# 保存數據到MySQL中
def save_mysql(self):
sql = "insert into task1(link,title,info,times) VALUES (%s,%s,%s,%s)"
try:
self.cursor.execute(sql, (self.link, self.title, self.info, self.times))
self.connect.commit()
print('數據插入成功')
except Exception as e:
print(e, '數據插入錯誤')
# 新建對象,然後將數據傳入類中
def mysql(link, title, info, times):
down = DownMysql(link, title, info, times)
down.save_mysql()
if __name__ == '__main__':
parse()
4.3數據編碼處理
我們通過爬蟲程序可以得到網站返回的數據,但是返回的數據在展示過程中,出現了亂碼的問題,是因爲網站本身有自己的字符編碼(通常情況下是UTF-8),我 們程序在採集完成之後在控制檯進行展示的過程中是 使用本地默認編碼(windows 一般是 gbk、 unix中一 般是utf-8),如果兩部分編碼不一致,就會出現亂碼的問題。