網路爬蟲介紹
什麼是爬蟲
網路爬蟲也叫網路蜘蛛,是一種“自動化瀏覽網路”的程式,或者說是一種網路機器人。它們被廣泛用於網際網路搜尋引擎或其他類似網站,以獲取或更新這些網站的內容和檢索方式。它們可以自動採集所有其能夠訪問到的頁面內容,以供搜尋引擎做進一步處理(分檢整理下載的頁面),而使得使用者能更快的檢索到他們需要的資訊。簡單來講就是模擬瀏覽器請求網頁。
爬蟲的用處
- Web爬蟲作為搜尋引擎的重要組成部分
- 建立資料集以用於研究,業務和其他目的。比如:
①收集營銷資料,對營銷方案決策提供輔助。
②分析網民對某件事物的評價,比如新聞事件、電影、書籍等。
③分析行業發展趨勢,比如房價、薪資水平。
④社會計算方面的統計和預測,比如票房。
知識準備
http協議
- 常用的請求方法GET、POST等
- 常見的狀態碼200 OK、400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、500 Internal Server Error、503 Server Unavailable等
- 常用的請求報頭:
| header | 解釋 | 示例 |
| --- | --- | --- |
| cookie | 設定伺服器使用Set-Cookie傳送的http cookie | BDTUJIAID:05825f9e3bc27f571e88d3c21671410f|
| Referer | 表示瀏覽器所訪問的前一個頁面 | http://www.google.com/|
| User-Agent | 瀏覽器的身份標識字串 | Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36|
| Accept | 可接受的響應內容型別 | text/plain, text/html |
| Accept-Charset | 可接受的字符集 | utf-8|
| Accept-Encoding | 可接受的內容壓縮編碼型別 | compress, gzip|
前端知識
- 對HTML、CSS、JavaScript等有一定的掌握
爬蟲語言
- 選擇爬蟲用的語言,比如python, 掌握python的基本語法、包的下載與使用
爬蟲的基本步驟
目標分析-》傳送請求-》解析響應頁面-》儲存內容-》資料分析
python爬蟲用到的庫
請求庫
- requests: requests庫是python的一個第三方請求庫,基於urllib庫(python用於HTTP請求的自帶標準庫)改寫而成,因此相比urllib庫requests更富人性化、便捷性,是爬蟲邏輯中使用最頻繁的HTTP請求庫。
- Selenium:一個自動化測試工具庫,利用它可以執行瀏覽器特定的動作,比如跳轉、輸入、點選、下拉等。
- aio http:提供非同步Web服務,提高爬蟲...
解析庫
- BeautifulSoup 是一個可以從HTML或XML檔案中提取資料的Python庫.它將html的標籤檔案解析成樹結構,然後方便的獲取到指定標籤的對應屬性。BeautifulSoup除了支援Python標準庫中的HTML解析器之外,還支援一些第三方的解析器,BeautifulSoup官方推薦使用lxml作為解析器。BeautifulSoup()的構造方法需要傳入兩個引數:
soup = BeautifulSoup("<html>data</html>",'lxml') //第一個引數是一段網頁程式碼或一個網頁檔案,第二個引數是解析網頁的庫,這裡使用lxml庫.
Beautiful Soup將複雜HTML文件轉換成一個複雜的樹形結構,每個節點都是Python物件。
①Tag:Tag 物件與XML或HTML原生文件中的tag相同,比如soup.p表示p標籤
②Attributes:一個tag可能有很多個屬性. 比如 <p class="boldest">
tag的屬性的操作方法與字典相同: tag['class']
③find()方法是找到文件中符合條件的第一個元素,直接返回該結果。元素不存在時返回None
④find_all()方法是找到文件中所有符合條件的元素,以列表的形式返回。元素不存在時返回空列表
⑥CSS選擇器的使用方法與CSS定位標籤的方式相似,主要有.class 和 #id
- 使用正則表示式,python中的re模組可使用正則表示式進行匹配。
- pyquery庫是jQuery的Python實現,能夠以jQuery的語法來操作解析html文件
儲存內容
- 資料庫,如MySql、MongoDB
- 檔案
資料分析庫
- jieba:是目前最好的 Python 中文分片語件,支援 3 種分詞模式:精確模式、全模式、搜尋引擎模式,同時支援繁體分詞、自定義詞典。
- numpy:高效能科學計算和資料分析的基礎包,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。
- pandas:pandas 是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函式和方法。
- matplotlib 資料視覺化工具,可生成各種2D影象。
簡單示例
環境搭建
- 安裝python3.6.5
- 使用pip install xx 命令依次安裝requests、lxml、beautifulsoup4、jieba、numpy、pandas、matplotlib、wordcloud
初階爬蟲示例介紹
- 爬取豆瓣上關於《權力的遊戲第七季》的所有短評
requrl = 'https://movie.douban.com/subject/' + movieId + '/comments' +'?' +'start=' + str(start) + '&limit=20' response = requests.get(requrl) #傳送請求 if response.status_code == 200: html = response.text# 獲取響應html內容 soup = BeautifulSoup(html, 'lxml') # 構建BeautifulSoup物件,使用lxml作為解析器 comment_div_lits = soup.find_all('div', class_='comment')# 找到對應標籤及屬性 for item in comment_div_lits: # 迴圈 comment = item.find_all('span', class_='short')[0].string # 獲取評論內容 eachCommentList.append(comment) # 新增到list列表 return eachCommentList # 返回列表
爬蟲框架scrapy
Scrapy是用純Python實現一個為了爬取網站資料、提取結構性資料而編寫的應用框架,用途非常廣泛,使用者只需要定製開發幾個模組就可以輕鬆的實現一個爬蟲。Scrapy 使用了 Twisted'twɪstɪd非同步網路框架來處理網路通訊,可以加快我們的下載速度,不用自己去實現非同步框架,並且包含了各種中介軟體介面,可以靈活的完成各種需求。
scrapy元件列表
- Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等。
- Scheduler(排程器): 它負責接受引擎傳送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。
- Downloader(下載器):負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
- Spider(爬蟲):它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,並將需要跟進的URL提交給引擎,再次進入Scheduler(排程器),
- Item Pipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、儲存等)的地方.
- Downloader Middlewares(下載中介軟體):位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
- Spider Middlewares(Spider中介軟體):介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
scrapy執行流程
- 1、引擎啟動觸發事務
- 2、引擎從排程器中取出一個連結(URL)用於接下來的抓取
- 3、引擎把URL封裝成一個請求(Request)傳給下載器
- 4、下載器把資源下載下來,並封裝成應答包(Response)
- 5、爬蟲解析Response
- 6、解析出的實體(Item),則交給實體管道進行進一步的處理
- 7、解析出的是連結(URL),則把URL交給排程器等待抓取
建立專案步驟
- 1、使用pip install xx命令安裝scrapy、Twisted(非同步網路框架處理網路通訊)
- 2、進入您打算儲存程式碼的目錄中,執行下列命令:scrapy startproject tutorial # tutorial為專案名稱,自行定義
該命令將會建立包含下列內容的 tutorial 目錄:
tutorial/ scrapy.cfg tutorial/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py ...
這些檔案分別是:
- scrapy.cfg: 專案的配置檔案
- tutorial/: 該專案的python模組
- tutorial/items.py: 專案的目標實體檔案
- tutorial/pipelines.py: 專案的管道檔案.
- tutorial/settings.py: 專案的設定檔案.
- tutorial/spiders/: 儲存爬蟲程式碼目錄
spiders目錄下新建爬蟲檔案:
import scrapy class testSpider(scrapy.Spider): name = "tutorial" allowed_domains = ["baidu.com"] start_urls = ( 'https://www.baidu.com/', ) def parse(self, response): pass
反爬蟲與反反爬蟲介紹
常見的反爬蟲
1、通過網頁的請求頭
- User-Agent:這個是儲存使用者訪問該網站的瀏覽器的資訊,例如Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36,requests庫本身的headers裡沒有User-Agent,所以網站可以拒絕掉沒有User-Agent或者頻繁使用一個User-Agent的請求。
- Referer:當瀏覽器傳送請求時,一般都會帶上這個,表示當前請求是由哪個連結進來的。網站也可以拒絕沒有Referer或者頻繁使用同個Referer的請求。
- authorization:有的網站還會有這個請求頭,這個是在使用者在訪問該網站的時候就會分配一個id給使用者,然後在後臺驗證該id有沒有訪問許可權從而來進行發爬蟲。
2、使用者訪問網站的ip
當不斷地使用一個ip來訪問一個網站時,網頁後臺也會判斷你是一個機器,把你的ip封掉。
3、驗證碼
當頻繁請求一個網址,比如登入時,會出現驗證碼。
反反爬蟲策略
1.新增請求頭
在請求頭headers新增請求頭,比如可以網上找別人整理的User-Agent列表,請求時從列表裡隨機取出使用。
2.使用代理ip
網上有一些免費的代理ip,比如 https://www.xicidaili.com/等 ,但使用的人太多了也經常被封掉,可以自己爬取一些免費代理ip建成ip池,請求的時候從ip池隨機取出使用。也可以購買付費的ip,質量比較高。
3.處理驗證碼
對於比如登入時只要驗證一次的簡單圖片驗證碼,可以把驗證碼圖片下載下來,手動輸入;對於類似滑塊驗證碼,可以用selenium庫模擬使用者滑動解鎖;對於更復雜的驗證碼可接入收費的打碼平臺。