網絡爬蟲
網絡爬蟲(web crawler),是按照一定的規則自動瀏覽萬維網並獲取信息的機器人程序(或腳本),曾經被廣泛的應用於互聯網搜索引擎,使用過互聯網和瀏覽器的人都知道,網頁中除了供用戶閱讀的文字信息以外,還包含了一些超鏈接。網絡爬蟲系統正式通過網頁中的超鏈接信息不斷獲取網絡上的其他頁面。
網絡爬蟲的相關工具
1、Chrome Developer Tools:谷歌瀏覽器內置的開發者工具
2、POSTMAN:強大的網頁跳是與RESTful請求工具
3、HTTPie:命令行HTTP客戶端
4、BuiltWith:識別網站所用技術的工具
5、python-whois:查詢網站所有者的工具
6、robotparser:解析robots.txt的工具
爬蟲步驟
一個基本的爬蟲通常分爲數據採集(網頁下載)、數據處理(網頁解析)和數據存儲(將有用的信息持久化)三個部分內容。
一般來說爬蟲工作流程包括以下幾個步驟:
1、設定抓取目標(種子頁面/起始頁面)並獲取網頁。
2、當服務器無法訪問時,按照指定的重試次數嘗試重新下載頁面。
3、在需要的時候設置用戶代理或隱藏真實IP,否則可能無法訪問頁面。
4、對獲取的頁面進行必要的解碼操作然後抓取出需要的信息。
5、在獲取的頁面中通過某種方式(如正則表達式)抽取出頁面中的鏈接信息。
6、對鏈接進行進一步的處理(獲取頁面並重覆上面的動作)。
7、將有用的信息進行持久化以備後續處理。
爬取小說——《壞蛋是怎樣煉成的》
# !/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import re
url = 'https://www.biquguan.com/bqg337675/'
'''模擬瀏覽器發送http請求'''
response = requests.get(url)
'''編碼方式設置爲tuf-8'''
response.encoding = "utf-8"
'''將目標小說主頁的網頁源碼轉換爲文本'''
html = response.text
'''找到小說的書名'''
title = re.findall(r'<meta property="og:title" content="(.*?)" />',html)[0]
'''新建一個文件,保存小說內容'''
fb = open('%s.txt' % title, 'w',encoding='utf-8')
'''獲取每一章的信息(章節,url)'''
dl = re.findall(r'<div id="list">.*?</dl>',html,re.S)[0] #加上re.S後,匹配包括所有的包括空格回車的字符
chapter_info_list = re.findall(r'href="(.*?)">(.*?)<',dl,re.S)
'''循環每一個章節,分別去下載'''
for chapter_info in chapter_info_list:
chapter_url,chapter_title = chapter_info
chapter_url = "https://www.biquguan.com/bqg337675/" + chapter_url#此處儘量不要用加號,爲了節省內存
'''下載章節內容'''
chapter_response = requests.get(chapter_url)
chapter_response.encoding = 'utf-8'
chapter_html = chapter_response.text
'''提取下載章節內容中的小說主體'''
chapter_content = re.findall(r'<div id="content">(.*?)<script>chaptererror\(\);</script>',chapter_html,re.S)[0]
'''清洗與小說內容無關的數據'''
chapter_content = chapter_content.replace(r'\s','')
chapter_content = chapter_content.replace(' ','')
chapter_content = chapter_content.replace('<br />', '')
chapter_content = chapter_content.replace('<br/>','')
'''將數據持久化——保存小說'''
fb.write(chapter_title)
fb.write(chapter_content)
fb.write('\n')
爬蟲注意事項
1、處理相對鏈接,有時候我們從頁面中獲取的鏈接不是一個完整的絕對鏈接而是一個相對鏈接,這種情況下需要將其與URL前綴進行拼接(urllib.parse中的urljoin()函數可以完成此項操作)。
2、設置代理服務,有些網站會限制訪問的區域(例如美國的Netfllix屏蔽了很多國家的訪問),有些爬蟲需要隱藏自己的身份,在這種情況下可以設置使用代理服務器,代理服務器有免費(如西刺代理、快代理)和付費兩種(如訊代理、阿布雲代理),付費的一般穩定性和可用性都更好,可以通過rullib.request中的ProxyHandler來爲請求設置代理。
3、限制下載速度,如果我們的爬蟲獲取網頁的速度過快,可能就會面臨被封禁或者產生“損壞動產”的風險(可能會導致喫官司並且敗訴),可以在倆次下載之間添加延時從而對爬蟲進行限速。
4、避免爬蟲陷阱,有些網站會動態生成頁面內容,這會導致產生無限多的頁面(例如在線萬年曆通常會有無窮無盡的鏈接)。可以通過記錄達到當前頁面經過了多少個鏈接(鏈接深度)來解決該問題,當達到事先設定的最大深度時爬蟲就不再像隊列中添加該網頁中的鏈接了。
5、SSL相關問題,在使用urlopen打開一個HTTPS鏈接時會驗證一次SSL證書,如果不做處理會產生錯誤提示:“SSL:CETRIFICATE_VERIFY_FAILED”,可以通過以下兩種方式解決:
1、使用未經驗證的上下文
import ssl
request = rullib.request.Request(url='...',headers={...})
context = ssl._create_unverified_context()
web_page = urllib.request.urlopen(request,context=context)
2、設置全局的取消證數驗證
import ssl
ssl._create_default_https_context = ssl._create_unverified_context