寫爬蟲時經(jīng)常對網(wǎng)址發(fā)起請求,結(jié)果返回的html數(shù)據(jù)除了標簽能看懂,其他的全部是亂碼。大家如果對爬蟲感興趣,請耐心" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 寫爬蟲時如何解決網(wǎng)頁亂碼問題

寫爬蟲時如何解決網(wǎng)頁亂碼問題

時間:2023-07-04 05:39:01 | 來源:網(wǎng)站運營

時間:2023-07-04 05:39:01 來源:網(wǎng)站運營

寫爬蟲時如何解決網(wǎng)頁亂碼問題:實戰(zhàn)講解,文章較長,對爬蟲比較熟悉的瀏覽翻看章節(jié) 2.3 獲取新聞文本內(nèi)容。

寫爬蟲時經(jīng)常對網(wǎng)址發(fā)起請求,結(jié)果返回的html數(shù)據(jù)除了標簽能看懂,其他的全部是亂碼。大家如果對爬蟲感興趣,請耐心閱讀本文,我們就以百度風雨榜爬蟲為例學習下亂碼處理問題。

http://top.baidu.com/buzz?b=1














百度風云榜一共有50個關(guān)鍵詞,我們先任選其中一個打開看看。







一、實驗目的

我們的目的是chardect庫學會處理網(wǎng)絡響應數(shù)據(jù)的亂碼問題,結(jié)合具體爬蟲實戰(zhàn)講解。

二、代碼實戰(zhàn)

2.1 定位關(guān)鍵詞及其鏈接

F12鍵盤打開開發(fā)者工具,我們定位關(guān)鍵詞及其對應的html標簽。在這里我們使用pyquery庫定位 class屬性為'keyword'的td。










#百度風云榜頁面網(wǎng)址(含有50個熱門新聞的關(guān)鍵詞)fengyunbang_url = 'http://top.baidu.com/buzz?b=1'resp = requests.get(fengyunbang_url)#從html文件中解析出 事件字段和 網(wǎng)址字段doc = PyQuery(resp.text)for item in doc.items('.keyword'): keyword = item('a').text().split(' ')[0] keyword_link=item('a').attr.href print(keyword,keyword_link)運行,結(jié)果keyword全部為亂碼,沒有一點中文的痕跡。







這就是我們今天要克服的問題-html編碼問題。

遇到這種問題問題,我們可能會先在html標簽中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。













再次運行,漢字正常顯示。







2.2 定位搜索頁面新聞鏈接

上面我們獲取到了關(guān)鍵詞及其鏈接,瀏覽器點擊“46年吃3萬個漢堡”對應的鏈接,跳轉(zhuǎn)到 百度搜索頁,如下圖。







我們想獲取新聞內(nèi)容,而要獲取新聞內(nèi)容,我們就要知道新聞對應的鏈接。首先我們要定位,如下圖。這里我們使用另外一種方式定位鏈接-正則表達式。







def get_keywords_news_links(keyword_link): """ 訪問關(guān)鍵詞百度網(wǎng)址,得到相關(guān)新聞的link :param keyword_link: :return: """ headers = {'User-Agent': '你的user-agent'} resp = requests.get(keyword_link, headers=headers) bsObj = BeautifulSoup(resp.text, 'html.parser') news_items = bsObj.find_all('div', {'class': 'result c-container '}) news_links = [] for item in news_items: links = re.findall('href="(.*?)"', str(item)) news_links.extend(links) #防止鏈接重復 news_links = set(news_links) return news_links但是后來發(fā)現(xiàn)有的鏈接是無法訪問的,比如運行中居然抽取出含有http://cache.baiducontent***這種的網(wǎng)頁,經(jīng)過測試,只要剔除掉這種鏈接,剩下的都為有效鏈接。







2.3 獲取新聞文本內(nèi)容

有了上文獲取到的鏈接,我們寫個簡單的代碼獲取文本內(nèi)容。由于獲取到的網(wǎng)址來源成百上千的網(wǎng)站,如果要精確獲取新聞內(nèi)容,需要對每一個網(wǎng)站一對一的進行定位。這樣太麻煩,為了快速方便,我們使用正則匹配出所有的中文內(nèi)容。

def get_news_content(link): """ 根據(jù)新聞網(wǎng)址,獲取新聞數(shù)據(jù) :return: 新聞內(nèi)容 """ resp = requests.get(link) #最終只有漢字保留。 news_text = ''.join(re.findall('[/u4e00-/u9fa5]+', resp.text)) return news_text但是運行過程中,經(jīng)常返回空。說明正則匹配中文時候匹配不到。很可能的原因是頁面中沒有中文,但是我們檢測了這些頁面都是有中文的,那么很有可能是因為頁面亂碼,導致正則[/u4e00-/u9fa5]+無法匹配到中文。經(jīng)過檢測,真的是亂碼。解決辦法resp.encoding='編碼'。但是編碼是什么值呢?這里我用新的方法,chardect庫檢測二進制數(shù)據(jù)中采用的編碼方式。

def get_news_content(link): """ 根據(jù)新聞網(wǎng)址,獲取新聞數(shù)據(jù) :return: 新聞內(nèi)容 """ resp = requests.get(link) news_text = ''.join(re.findall('[/u4e00-/u9fa5]+', resp.text)) #網(wǎng)頁亂碼,導致news_text為空 if not news_text: #根據(jù)二進制數(shù)據(jù)檢測html的編碼。 #resp.content獲取html二進制數(shù)據(jù) chaset = chardet.detect(resp.content)['encoding'] #解決編碼問題 resp.encoding = chaset news_text = ''.join(re.findall('[/u4e00-/u9fa5]+', resp.text)) return news_text return news_text

2.4 編寫爬蟲主函數(shù)

編寫爬蟲主函數(shù),將數(shù)據(jù)保存到csv中。

#主函數(shù),訪問并保存所有的新聞數(shù)據(jù)def FetchAndSave(): #百度風云榜頁面網(wǎng)址(含有50個熱門新聞的關(guān)鍵詞) fengyunbang_url = 'http://top.baidu.com/buzz?b=1' resp=requests.get(fengyunbang_url) resp.encoding='gb2312' #新建excel文件保存數(shù)據(jù)。 csvf = open('data.csv', 'a+', encoding='gbk', newline='') writer = csv.writer(csvf) writer.writerow(('news_content', 'keyword')) #從heml文件中解析出 事件字段和 網(wǎng)址字段 doc = PyQuery(resp.text) for itm in doc.items('.keyword'): keyword = itm('a').text().split(' ')[0] keyword_link = itm('a').attr.href news_links = get_keywords_news_links(keyword_link) for news_link in news_links: try: content = get_news_content(news_link) #防止新聞內(nèi)容為空的寫入csv中 if content: writer.writerow((content, keyword)) except: print(news_link)#運行爬蟲FetchAndSave()





運行爬蟲,采集了50個關(guān)鍵詞共388篇新聞內(nèi)容。










數(shù)據(jù)采集

【視頻講解】Scrapy遞歸抓取簡書用戶信息

美團商家信息采集神器

gevent:異步理論與實戰(zhàn)

輕盈高效的異步訪問庫grequests庫

selenium驅(qū)動器配置詳解

爬蟲神器PyQuery的使用方法

簡易SQLite3數(shù)據(jù)庫學習




文本處理分析

如何從文本中提取特征信息?

對于中文,nltk能做哪些事情

留在網(wǎng)上的每個字,都在泄露你的身份




數(shù)據(jù)結(jié)構(gòu)

優(yōu)雅簡潔的列表推導式

Get小技巧等分列表

如何對數(shù)據(jù)進行各種排序?




雜文

Python通過字符串調(diào)用函數(shù)

Python圈中的符號計算庫-Sympy

Python中處理日期時間庫的使用方法

為什么你要為2019,而不是2018做計劃?

2017年度15個最好的數(shù)據(jù)科學領域Python庫




http://weixin.qq.com/r/pjo6IhLEJU9arVZB92_0 (二維碼自動識別)




打賞還可提問哦!

項目代碼鏈接: 鏈接: https://pan.baidu.com/s/1f6tjIodW_RD1SXrdskdXdw 密碼: sqfb

如果你有什么問題,也可以掃碼提問。大鄧知無不言,言無不盡。








關(guān)鍵詞:解決,爬蟲

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉