1. 程式人生 > >網絡爬蟲簡單介紹(python)

網絡爬蟲簡單介紹(python)

我們 大型 搜索 () 介紹 面積 截取 困難 狀況

一、簡介

爬蟲就是利用代碼大量的將網頁前端代碼下載下來使用的一種程序,一般來說常見的目的為下:

1、商業分析使用:很多大數據公司都會從利用爬蟲來進行數據分析與處理,比如說要了解廣州當地二手房的均價走勢就可以到房屋中介的網站裏去爬取當地房源的價錢除以平方米

2、訓練機器:機器學習需要大量的數據,雖然網絡上有許多免費的庫可以提供學習,不過對於部分機器他們需要的訓練資料比較新,所以需要去爬取實時的數據

3、練習爬蟲技術:很多網絡爬蟲其實沒有什麽商業目的性,只是程序員拿來練習用的

4、其他程序:像是搜索引擎之類的程序也是需要利用爬蟲技術來完成他們的功能

一般的網頁,尤其是大型的網頁,都會進行反爬蟲的機制,原因為下:

1、爬蟲占用了大量的服務器資源,造成互聯網企業的運維成本增加,並且會影響到正常用戶的使用

2、部分商業信息是有價值的,不希望被商業對手拿去使用,比如說餐廳評論或是房源資訊

下圖是我在網絡上看到的爬蟲與反爬蟲簡單介紹,我覺得做的挺好的

技術分享圖片

現在許多網站基於用戶體驗是不會需要用戶登錄的,更不需要輸入驗證碼之類的,比較常見的是在前端和ID做不規律的變換,讓你爬取困難,然後根據IP的瀏覽狀況來封鎖

技術分享圖片

二、爬蟲的基本步驟

爬蟲的方式很多,但基本上脫離不了這幾個步驟

1、找尋URL:每個網頁都有個URL,爬蟲首先要知道這個網頁的URL才能去抓取這個網頁的資料,URL裏面最重要的就是它裏面的ID,像是豆瓣裏面,盜夢空間的ID為3541415,蝴蝶效應為1292343,阿凡達為1652587,所有如果我們寫程序將ID0-9999999的頁面全部爬取完,就可以獲得所有豆瓣上的資料,但其實裏面大部分的ID都是沒有內容的頁面,這會大幅度降低我們爬蟲的效率,另外一種方式是利用前端代碼裏面的URL找尋目標,一般來說,像是淘寶首頁,會有許多的URL可以抓取,而進入商品網頁後又有相關商品的URL可以抓取,利用這種方式可以高效的抓取URL,但缺點是抓不全,而且容易陷入循環,抓取重復的URL。

下圖為搜狐新聞的網頁,利用查看可以很快的看到新聞URL的位置

技術分享圖片

利用復制下幾個新聞鏈接的XPATH,可以發現其規律,再利用XPATH去抓這些URL,這邊由於搜狐在前端有加了反爬蟲的機制,所以比較難一次爬全,需要多嘗試幾種XPATH才能獲得首頁所有的新聞鏈接,下面的代碼可以幫助獲取首頁部分的新聞URL位置

def link_list():
    url = http://news.sohu.com/
    data = requests.get(url).text
    s = etree.HTML(data)
    links = s.xpath(/html/body/div[1]/div[5]/div[1]/div/div[2]/div/div/ul/li/a/@href
)

2、下載頁面:利用URL找尋到頁面後,將頁面下載下來,python可以用requests組件來執行這個動作

    url = http://news.sohu.com/
    data = requests.get(url).text

3、提取有用數據:由於網頁前端含有大量的HTML標註代碼,並且還包含了大量我們不需要的東西,像是我要獲取房屋的均價,我只需要房屋的價錢跟面積就可以了,剩下的那些介紹我都不需要,這就需要利用一些組件來提取數據了,python裏比較常見的是beautifulsoup跟lxml,下面是利用lxml來解析HTML再提取文章的標題 (需要先找到標題的XPATH)

    s = etree.HTML(data)
    titles = s.xpath(/html/body/div[1]/div[5]/div[1]/div/div[2]/div/div/ul/li/a/text())

4、儲存數據:將數據提取出來當然是要找地方儲存,我是儲存在txt檔裏,當然也可以用其他格式儲存,下面是將搜狐的URL用for循環跑了一遍,並將新聞的內容提取出來儲存在txt裏面以供使用

    for link in links:
        content = requests.get(link).text
        s = etree.HTML(content)
        words = s.xpath(//*[@id="mp-editor"]/p/text())
        print(words)
        f = open(news2.txt,a)
        for word in words:
            f = open(news2.txt,a)
            f.write(word)
            f.write("\n")
        f.write("---------------------------------------")
        f.close()

以下為抓取到的新聞標題與內容,只截取了部分,可以看到已經是純文字了,而且是我們要的新聞內容

技術分享圖片

由於搜狐也是有前端反爬蟲的保護,所以一開始在抓取內容的時候容易漏抓部分的內容,但多觀察幾篇的代碼就可以找出它變化的規律,將所有的規律寫入就可以提高抓取的完整度。

技術分享圖片

網絡爬蟲簡單介紹(python)