爲了獲取多源數據須要到各個網站獲取一些景點的評論信息和圖片,首先選到了攜程和螞蜂窩這兩個網站,將一些爬取過程記錄下來 php
PS:(本人長期出售超大量微博數據、旅遊網站評論數據,並提供各類指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。同時歡迎加入社交媒體數據交流羣:99918768)html
首先咱們去攜程的鼓浪嶼景點速覽看一下咱們要爬取的頁面,大概發現有幾十個景點,每一個景點的結構應該都是差很少的,因此咱們選擇第一個景點進去看看具體的頁面應該怎麼爬取。python
咱們須要的是紅圈的部分,很容易能夠知道這個評論頁面是動態加載的,因此不能直接用bs4或者正則直接提取元素,咱們須要分析一下頁面動態傳輸的接口。打開chrome審查元素,切換到network查看一下傳輸的內容,首先清空內容避免干擾,而後點擊下一頁,咱們能夠獲得mysql
經過查看傳回的數據咱們能夠獲得這就是咱們所要的接口,使用的是post進行傳輸,傳輸的Form Data 有不少字段,大體能夠猜想出來git
poiID 是景點的poiID pagenow 是當前的頁數 star 是評分1-5,0表明所有 resourceId 是一個每一個資源對應的值
爬取的時候只須要改變這些值就能夠根據本身的需求爬取內容了,可是須要注意的事攜程的pagenow最多隻能獲取100頁,並且poiID和resourceId的值是沒有規律的,須要咱們逐個景點查看...我本身依次找了鼓浪嶼全部景點的值,並存在文本中,文末有github的共享。github
咱們要作的第一件事就是想好數據庫的結構,我選擇的仍是使用mysql,具體的結構以下:ajax
這個我就不具體分析了,也不難,就是有幾個坑要注意一下。sql
第一,不是全部評論都有景色,性價比之類的評分,因此這裏要加一個判斷。 第二,原來是有出行時間這一項的,如今好像沒有了額。 第三,評論文本可能會出現單引號,插入數據庫會出現錯誤,要轉義或者替代一下。 第四,抓取速度不要太快,攜程反扒仍是比較厲害的。
一樣,螞蜂窩的數據也是動態加載的,用相同的方法查看分析數據接口。chrome
能夠看到螞蜂窩的數據獲取方式是get,咱們能夠找出請求的url的規律。通過比較不一樣景點和不一樣頁面的數據,咱們發現參數的改變主要在兩個地方,一個是poiid我用href代替,一個是頁數我用num代替。獲取景點的評論數據只要改變這兩個值就能夠了數據庫
url=' http://pagelet.mafengwo.cn/po...{href}%22%2C%22page%22%3A{num}%2C%22just_comment%22%3A1%7D'
這個不是post請求咱們就沒必要一個個景點去獲取參數了,咱們能夠訪問這個站點來發現全部的用戶,然而這個站點的數據也是動態加載的
根據上面的圖片咱們能夠清晰的看到咱們只須要傳入頁碼數就能夠獲得全部的景點的poiid,而後根據這些poiid咱們就能夠獲得全部的評論數據,這一部分咱們用一個函數來處理
def get_param(): # 獲取全部景點的參數 total = [] router_url = 'http://www.mafengwo.cn/ajax/router.php' for num in range(1, 6): params = { 'sAct': 'KMdd_StructWebAjax|GetPoisByTag', 'iMddid': 12522, 'iTagId': 0, 'iPage': num } pos = requests.post(url=router_url, data=params, headers=headers).json() soup_pos = BeautifulSoup(pos['data']['list'], 'lxml') result = [{'scenery': p['title'], 'href': re.findall(re.compile(r'/poi/(\d+).html'), p['href'])[0]} for p in soup_pos.find_all('a')] total.extend(result) return total
其他部分類似,再也不過多說明。
下面附上個人代碼
本人長期出售抓取超大量微博數據的代碼,並提供微博數據打包出售,Message to YuboonaZhang@Yahoo.com