什麼是爬蟲
網絡爬蟲也叫網絡蜘蛛,是一種「自動化瀏覽網絡」的程序,或者說是一種網絡機器人。它們被普遍用於互聯網搜索引擎或其餘相似網站,以獲取或更新這些網站的內容和檢索方式。它們能夠自動採集全部其可以訪問到的頁面內容,以供搜索引擎作進一步處理(分檢整理下載的頁面),而使得用戶能更快的檢索到他們須要的信息。簡單來說就是模擬瀏覽器請求網頁。html
爬蟲的用處
- Web爬蟲做爲搜索引擎的重要組成部分
- 創建數據集以用於研究,業務和其餘目的。好比:
①收集營銷數據,對營銷方案決策提供輔助。
②分析網民對某件事物的評價,好比新聞事件、電影、書籍等。
③分析行業發展趨勢,好比房價、薪資水平。
④社會計算方面的統計和預測,好比票房。
知識準備
http協議
- 經常使用的請求方法GET、POST等
- 常見的狀態碼200 OK、400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、500 Internal Server Error、503 Server Unavailable等
- 經常使用的請求報頭:
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
前端知識
- 對HTML、CSS、JavaScript等有必定的掌握
爬蟲語言
- 選擇爬蟲用的語言,好比python, 掌握python的基本語法、包的下載與使用
爬蟲的基本步驟
目標分析-》發送請求-》解析響應頁面-》存儲內容-》數據分析前端
python爬蟲用到的庫
請求庫
- requests: requests庫是python的一個第三方請求庫,基於urllib庫(python用於HTTP請求的自帶標準庫)改寫而成,所以相比urllib庫requests更富人性化、便捷性,是爬蟲邏輯中使用最頻繁的HTTP請求庫。
- Selenium:一個自動化測試工具庫,利用它能夠執行瀏覽器特定的動做,好比跳轉、輸入、點擊、下拉等。
- aiohttp:提供異步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 和 #idpython
- 使用正則表達式,python中的re模塊可以使用正則表達式進行匹配。
- pyquery庫是jQuery的Python實現,可以以jQuery的語法來操做解析html文檔
存儲內容
數據分析庫
- jieba:是目前最好的 Python 中文分詞組件,支持 3 種分詞模式:精確模式、全模式、搜索引擎模式,同時支持繁體分詞、自定義詞典。
- numpy:高性能科學計算和數據分析的基礎包,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
- pandas:pandas 是基於NumPy 的一種工具,該工具是爲了解決數據分析任務而建立的。Pandas 歸入了大量庫和一些標準的數據模型,提供了高效地操做大型數據集所需的工具。pandas提供了大量能使咱們快速便捷地處理數據的函數和方法。
- matplotlib 數據可視化工具,可生成各類2D圖像。
簡單示例
環境搭建
- 安裝python3.6.5
- 使用pip install xx 命令依次安裝requests、lxml、beautifulsoup四、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引擎和爬蟲之間的框架,主要工做是處理蜘蛛的響應輸入和請求輸出。
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
scrapy運行流程
- 一、引擎啓動觸發事務
- 二、引擎從調度器中取出一個連接(URL)用於接下來的抓取
- 三、引擎把URL封裝成一個請求(Request)傳給下載器
- 四、下載器把資源下載下來,並封裝成應答包(Response)
- 五、爬蟲解析Response
- 六、解析出的實體(Item),則交給實體管道進行進一步的處理
- 七、解析出的是連接(URL),則把URL交給調度器等待抓取
建立項目步驟
- 一、使用pip install xx命令安裝scrapy、Twisted(異步網絡框架處理網絡通信)
- 二、進入您打算存儲代碼的目錄中,運行下列命令:scrapy startproject tutorial # tutorial爲項目名稱,自行定義
該命令將會建立包含下列內容的 tutorial 目錄:shell
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
反爬蟲與反反爬蟲介紹
常見的反爬蟲
一、經過網頁的請求頭
- 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有沒有訪問權限從而來進行發爬蟲。
二、用戶訪問網站的ip
當不斷地使用一個ip來訪問一個網站時,網頁後臺也會判斷你是一個機器,把你的ip封掉。瀏覽器
三、驗證碼
當頻繁請求一個網址,好比登陸時,會出現驗證碼。網絡
反反爬蟲策略
1.添加請求頭
在請求頭headers添加請求頭,好比能夠網上找別人整理的User-Agent列表,請求時從列表裏隨機取出使用。app
2.使用代理ip
網上有一些免費的代理ip,好比https://www.xicidaili.com/等,但使用的人太多了也常常被封掉,能夠本身爬取一些免費代理ip建成ip池,請求的時候從ip池隨機取出使用。也能夠購買付費的ip,質量比較高。
3.處理驗證碼
對於好比登陸時只要驗證一次的簡單圖片驗證碼,能夠把驗證碼圖片下載下來,手動輸入;對於相似滑塊驗證碼,能夠用selenium庫模擬用戶滑動解鎖;對於更復雜的驗證碼可接入收費的打碼平臺。