摘要:前言本文整理自慕課網開發簡單爬蟲,將會記錄爬取百度百科詞條相關頁面的整個過程。本實例抓取百度百科詞條頁面以及相關詞條頁面的標題和簡介。分析目標格式進入百度百科詞條頁面,頁面中相關詞條的鏈接比較統一,大都是。
前言
本文整理自慕課網《Python開發簡單爬蟲》,將會記錄爬取百度百科“python”詞條相關頁面的整個過程。
抓取策略
確定目標:確定抓取哪個網站的哪些頁面的哪部分數據。本實例抓取百度百科python詞條頁面以及python相關詞條頁面的標題和簡介。
分析目標:分析要抓取的url的格式,限定抓取范圍。分析要抓取的數據的格式,本實例中就要分析標題和簡介這兩個數據所在的標簽的格式。分析要抓取的頁面編碼的格式,在網頁解析器部分,要指定網頁編碼,然后才能進行正確的解析。
編寫代碼:在網頁解析器部分,要使用到分析目標得到的結果。
執行爬蟲:進行數據抓取。
1、url格式
進入百度百科python詞條頁面,頁面中相關詞條的鏈接比較統一,大都是/view/xxx.htm。
2、數據格式
標題位于類lemmaWgt-lemmaTitle-title下的h1子標簽,簡介位于類lemma-summary下。
3、編碼格式
查看頁面編碼格式,為utf-8。
經過以上分析,得到結果如下:
在sublime下,新建文件夾baike-spider,作為項目根目錄。
新建spider_main.py,作為爬蟲總調度程序。
新建url_manger.py,作為url管理器。
新建html_downloader.py,作為html下載器。
新建html_parser.py,作為html解析器。
新建html_outputer.py,作為寫出數據的工具。
最終項目結構如下圖:
# coding:utf-8 import url_manager, html_downloader, html_parser, html_outputer class SpiderMain(object): def __init__(self): self.urls = url_manager.UrlManager() self.downloader = html_downloader.HtmlDownloader() self.parser = html_parser.HtmlParser() self.outputer = html_outputer.HtmlOutputer() def craw(self, root_url): count = 1 self.urls.add_new_url(root_url) while self.urls.has_new_url(): try: new_url = self.urls.get_new_url() print("craw %d : %s" % (count, new_url)) html_cont = self.downloader.download(new_url) new_urls, new_data = self.parser.parse(new_url, html_cont) self.urls.add_new_urls(new_urls) self.outputer.collect_data(new_data) if count == 10: break count = count + 1 except: print("craw failed") self.outputer.output_html() if __name__=="__main__": root_url = "http://baike.baidu.com/view/21087.htm" obj_spider = SpiderMain() obj_spider.craw(root_url)url_manger.py
# coding:utf-8 class UrlManager(object): def __init__(self): self.new_urls = set() self.old_urls = set() def add_new_url(self, url): if url is None: return if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) def add_new_urls(self, urls): if urls is None or len(urls) == 0: return for url in urls: self.add_new_url(url) def has_new_url(self): return len(self.new_urls) != 0 def get_new_url(self): new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_urlhtml_downloader.py
# coding:utf-8 import urllib.request class HtmlDownloader(object): def download(self, url): if url is None: return None response = urllib.request.urlopen(url) if response.getcode() != 200: return None return response.read()html_parser.py
# coding:utf-8 from bs4 import BeautifulSoup import re from urllib.parse import urljoin class HtmlParser(object): def _get_new_urls(self, page_url, soup): new_urls = set() # /view/123.htm links = soup.find_all("a", href=re.compile(r"/view/d+.htm")) for link in links: new_url = link["href"] new_full_url = urljoin(page_url, new_url) # print(new_full_url) new_urls.add(new_full_url) #print(new_urls) return new_urls def _get_new_data(self, page_url, soup): res_data = {} # url res_data["url"] = page_url #
# coding:utf-8 class HtmlOutputer(object): def __init__(self): self.datas = [] def collect_data(self, data): if data is None: return self.datas.append(data) def output_html(self): fout = open("output.html","w", encoding="utf-8") fout.write("") fout.write("") fout.write("
%s | " % data["url"]) fout.write("%s | " % data["title"]) fout.write("%s | " % data["summary"]) fout.write("
在命令行下,執行python spider_main.py。
編碼問題問題描述:UnicodeEncodeError: "gbk" codec can"t encode character "xa0" in position ...
使用Python寫文件的時候,或者將網絡數據流寫入到本地文件的時候,大部分情況下會遇到這個問題。網絡上有很多類似的文章講述如何解決這個問題,但是無非就是encode,decode相關的,這是導致該問題出現的真正原因嗎?不是的。很多時候,我們使用了decode和encode,試遍了各種編碼,utf8,utf-8,gbk,gb2312等等,該有的編碼都試遍了,可是仍然出現該錯誤,令人崩潰。
在windows下面編寫python腳本,編碼問題很嚴重。將網絡數據流寫入文件時,我們會遇到幾個編碼:
1、#encoding="XXX"
這里(也就是python文件第一行的內容)的編碼是指該python腳本文件本身的編碼,無關緊要。只要XXX和文件本身的編碼相同就行了。
比如notepad++"格式"菜單里面里可以設置各種編碼,這時需要保證該菜單里設置的編碼和encoding XXX相同就行了,不同的話會報錯。
2、網絡數據流的編碼
比如獲取網頁,那么網絡數據流的編碼就是網頁的編碼。需要使用decode解碼成unicode編碼。
3、目標文件的編碼
將網絡數據流寫入到新文件,寫文件代碼如下:
fout = open("output.html","w") fout.write(str)
在windows下面,新文件的默認編碼是gbk,python解釋器會用gbk編碼去解析我們的網絡數據流str,然而str是decode過的unicode編碼,這樣的話就會導致解析不了,出現上述問題。 解決的辦法是改變目標文件的編碼:
fout = open("output.html","w", encoding="utf-8")運行結果
https://github.com/voidking/b...
書簽Python開發簡單爬蟲
http://www.imooc.com/learn/563
The Python Standard Library
https://docs.python.org/3/lib...
Beautiful Soup 4.2.0 文檔
https://www.crummy.com/softwa...
Python詞條
http://baike.baidu.com/view/2...
http://baike.baidu.com/item/P...
Python3.x爬蟲教程:爬網頁、爬圖片、自動登錄
http://www.2cto.com/kf/201507...
使用python3進行優雅的爬蟲(一)爬取圖片
http://www.jianshu.com/p/6969...
Python UnicodeEncodeError: "gbk" codec can"t encode character 解決方法
http://www.jb51.net/article/6...
Scrapy documentation
https://doc.scrapy.org/en/lat...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38399.html
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:概述這是一個網絡爬蟲學習的技術分享,主要通過一些實際的案例對爬蟲的原理進行分析,達到對爬蟲有個基本的認識,并且能夠根據自己的需要爬到想要的數據。 概述 這是一個網絡爬蟲學習的技術分享,主要通過一些實際的案例對爬蟲的原理進行分析,達到對爬蟲有個基本的認識,并且能夠根據自己的需要爬到想要的數據。有了數據后可以做數據分析或者通過其他方式重新結構化展示。 什么是網絡爬蟲 網絡爬蟲(又被稱為網頁...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:用途廣泛,可以用于數據挖掘監測和自動化測試。運行下,發現數據全部存到了數據庫中。提供了一些接口來查看項目爬蟲情況,以及執行或者停止執行爬蟲。完成小程序所需要的所有接口的開發,以及使用定時任務執行爬蟲腳本。 過完年回來,業余時間一直在獨立開發一個小程序。主要數據是8000+個視頻和10000+篇文章,并且數據會每天自動更新。 我會整理下整個開發過程中遇到的問題和一些細節問題,因為內容會比...
摘要:所以使用代理隱藏真實的,讓服務器誤以為是代理服務器的在請求自己。參考來源由于涉及到一些專業名詞知識,本節的部分內容參考來源如下代理服務器維基百科代理百度百科上一篇文章網絡爬蟲實戰和下一篇文章網絡爬蟲實戰使用發送請求 上一篇文章:Python3網絡爬蟲實戰---18、Session和Cookies下一篇文章:Python3網絡爬蟲實戰---20、使用Urllib:發送請求 我們在做爬蟲...
閱讀 3948·2021-09-24 10:24
閱讀 1386·2021-09-22 16:01
閱讀 2713·2021-09-06 15:02
閱讀 1013·2019-08-30 13:01
閱讀 1002·2019-08-30 10:52
閱讀 632·2019-08-29 16:36
閱讀 2231·2019-08-29 12:51
閱讀 2332·2019-08-28 18:29