08 數據采集:如何自動化采集數據?

重點介紹爬蟲做抓取
1.Python 爬蟲
1)使用 Requests 爬取內容。我們可以使用 Requests 庫來抓取網頁信息。Requests 庫可以說是 Python 爬蟲的利器,也就是 Python 的 HTTP 庫,通過這個庫爬取網頁中的數據,非常方便,可以幫我們節約大量的時間。
2)使用 XPath 解析內容。XPath 是 XML Path 的縮寫,也就是 XML 路徑語言。它是一種用來確定 XML 文檔中某部分位置的語言,在開發中經常用來當作小型查詢語言。XPath 可以通過元素和屬性進行位置索引。
3)使用 Pandas 保存數據。Pandas 是讓數據分析工作變得更加簡單的高級數據結構,我們可以用 Pandas 保存爬取的數據。最后通過 Pandas 再寫入到 XLS 或者 MySQL 等數據庫中。Requests、XPath、Pandas 是 Python 的三個利器。當然做 Python 爬蟲還有很多利器,比如 Selenium,PhantomJS,或者用 Puppeteer 這種無頭模式。##這里可以實踐一下
2.抓取工具
1)火車采集器
2)八爪魚
3)集搜客
09 數據采集:如何用八爪魚采集微博上的“D&G”評論

八爪魚傻瓜軟件,操作非常方便,比python爬蟲更容易上手用
10 Python爬蟲:如何自動化下載王祖賢海報?
python爬蟲筆記中介紹了用urlretrieve可以下載xpath的非結構化數據,參考:爬蟲3-python爬取非結構化數據下載到本地
這篇教程是從JSON和Xpath來介紹補充
如何使用 JSON 數據自動下載王祖賢的海報
這里我們用的url:https://www.douban.com/j/search_photo?q=%E7%8E%8B%E7%A5%96%E8%B4%A4&limit=20&start=0(這里給出的是json的鏈接。有時候顯示會有細微不同,方法是:用Chrome瀏覽器的開發者工具,可以監測出來網頁中是否有json數據的傳輸),打開JSON格式的,解析發現結構是:
{"images":
[{"src": …, "author": …, "url":…, "id": …, "title": …, "width":…, "height":…},
…
{"src": …, "author": …, "url":…, "id": …, "title": …, "width":…, "height":…}],
"total":26069,"limit":20,"more":true}
不如先用第一個頁面上手來個下載小例子:
# -*- coding: utf-8 -* import requests import json query = '王祖賢' url = 'https://www.douban.com/j/search_photo?q=' + 'query' + '&limit=20&start=0' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 " } html = requests.get(url, headers=headers).text # 得到返回結果,是一個json格式 response = json.loads(html, encoding='utf-8') # 將 JSON 格式轉換成 Python 對象 i=0 for image in response['images']: print(i) img_src = image['src'] #image是一個dict pic = requests.get(img_src, timeout=10) #這時候image其實是動態頁面 XHR 數據。還需要再請求對應的url filename='C:/Users/.../image_json_test/'+str(i)+'.jpg' fp=open(filename,'wb') #'b一般處理非結構化如圖片,wb有文件則覆蓋,無文件則新增' fp.write(pic.content) #注意這里content fp.close() i+=1
這里我們只爬取了20張圖片,從上面的json串:"total":26069,"limit":20,"more":true我們知道總數量26069,每20張分頁,要爬取更多,我們可以將圖片download寫成幻術,控制url翻頁循環:
import requests import json query = '王祖賢' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 " } def download(src, id): # 圖片下載函數 filename = 'C:/Users/luxia/PycharmProjects/shujuyunying/image_json_test/' + str(id) + '.jpg' try: pic = requests.get(src, timeout=10) f = open(filename, 'wb') f.write(pic.content) f.close() except requests.exceptions.ConnectionError: print('圖片無法下載') ''' for 循環 請求全部的 url ''' for i in range(20, 26069, 20): url = 'https://www.douban.com/j/search_photo?q=' + query + '&limit=20&start=' + str(i) html = requests.get(url, headers=headers).text # 得到返回結果 response = json.loads(html, encoding='utf-8') # 將 JSON 格式轉換成 Python 對象 for image in response['images']: img_src = image['src'] # 當前下載的圖片網址 download(img_src, image['id']) # 下載一張圖片
如何使用 XPath 自動下載王祖賢的電影海報封面
JSON 的數據格式數據結構很清爽,通過 Python 的 JSON 庫就可以解析。
但有時候,網頁會用 JS 請求數據,那么只有 JS 都加載完之后,我們才能獲取完整的 HTML 文件。XPath 可以不受加載的限制,幫我們定位想要的元素。
講義中推薦使用XPath Helper 插件獲取Xpath路徑,其中在瀏覽器 中可以用f12開啟開發者模式點選頁面元素查看xpath,在HTML中右鍵也可以復制粘貼xpath路徑,具體可以參考爬蟲相關的博文。
有時候當我們直接用 Requests 獲取 HTML 的時候,發現想要的 XPath 並不存在。這是因為 HTML 還沒有加載完,因此你需要一個工具,來進行網頁加載的模擬,直到完成加載后再給你完整的 HTML。在 Python 中,這個工具就是 Selenium 庫(這里暫時不涉及)。

