內容分享:微信公眾號文章爬取實(shí)戰
優(yōu)采云 發(fā)布時(shí)間: 2020-09-06 05:54微信公眾號文章抓實(shí)戰
在之前的爬蟲(chóng)實(shí)戰中,我們基于關(guān)鍵詞搜索了相關(guān)的微信公眾號文章,并獲得了一系列相關(guān)的文章標題,鏈接等。找到文章后,我們需要保存,此實(shí)驗的目的是抓取微信公眾號文章文本內容。
實(shí)驗環(huán)境
python3
主要使用的請求pyquery庫
步驟分析
本文使用CSDN公共帳戶(hù)的Python來(lái)抓取北京二手房數據,以分析北票人是否負擔得起房屋? 隨附完整的源代碼作為示例,
在請求此頁(yè)面后,我們獲得文章標題,作者,官方帳戶(hù)信息和文章文本信息。由于我們要顯示文章的內容,因此為了確保文章文本的格式不變,我們提取html格式,最后將所有提取的內容合并為html格式,并通過(guò)瀏覽器保持文章的原創(chuàng )格式。
應注意,文章中的所有圖片均來(lái)自互聯(lián)網(wǎng)。這些圖片無(wú)法通過(guò)打開(kāi)本地html進(jìn)行解析,因此我們提取了圖片鏈接,然后將其下載并保存到本地,并且html中的圖片鏈接替換了本地位置。
在實(shí)驗過(guò)程中確定文章標題
文章標題位于以下位置:
1<br />2<br />
<br />title = doc.find('.rich_media_title').text()<br />
確認官方帳戶(hù)信息
作者信息,官方帳戶(hù)的來(lái)源,微信帳戶(hù)以及官方帳戶(hù)的介紹都可以通過(guò)pyquery提?。?/p>
1<br />2<br />3<br />4<br />
# 微信公眾號<br />author = doc.find('#meta_content .rich_media_meta_text').text()<br />source = doc.find('#js_name').text()<br />source_info = doc.find('.profile_meta_value').text()<br />
確認文章的內容
文章的正文內容無(wú)法通過(guò)text()提取,因為提取的內容只是文本部分,而且缺少格式,因此顯示起來(lái)非常難看,因此我們使用html()保留身體部位的html元素:
1<br />2<br />
# 正文內容<br />content = doc.find('.rich_media_content')<br />
提取所有圖像鏈接
所有圖像鏈接都在img元素的data-src屬性中:
1<br />2<br />3<br />4<br />5<br />6<br />
# 所有圖片鏈接<br />pics_src = content.find('img').items()<br />for each in pics_src:<br /> if '=' in each.attr('data-src'):<br /> pic.append(each.attr('data-src'))<br />#print(pic)<br />
下載圖片
下載文章中的所有圖片并將其保存在本地文件中
1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />
def (title,url):<br /> print(url)<br /> pic_name = url.split('/')[4]<br /> pic_type = url.split('=')[1]<br /> response = requests.get(url,headers=random.choice(headers))<br /> try:<br /> if response.status_code == 200:<br /> file_dir = "{0}/{1}".format(os.getcwd(), title)<br /> if not os.path.isdir(file_dir):<br /> os.mkdir(file_dir)<br /> path = os.path.join(file_dir,pic_name+'.'+pic_type)<br /> if not os.path.exists(path):<br /> with open(path,'wb') as f:<br /> f.write(response.content)<br /> except:<br /> pass<br />
替換圖片
將文本鏈接中的圖像鏈接替換為本地圖像的鏈接,但要注意,我們需要在img元素中添加src屬性,因為實(shí)際的圖像鏈接存儲在此處,然后存儲圖像的位置用作src屬性值。
1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />
for item in content.find('img').items():<br /> pic_url = item.attr('data-src')<br /> if '=' in pic_url:<br /> pic_name = pic_url.split('/')[4]<br /> pic_type = pic_url.split('=')[1]<br /> image = pic_name + '.' + pic_type<br /> item.add_class('src')<br /> item.attr('src',image)<br />
生成index.html
以html格式添加先前提取的文章標題,作者和官方帳戶(hù)信息以生成index.html,然后將其打開(kāi)以查看微信正文內容。
1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />
file_dir = "{0}/{1}".format(os.getcwd(), title)<br />path = os.path.join(file_dir,'index.html')<br /><br />index = ''+title+'
'<br />index += ''+author+''+source+'
'<br />index += ''+source_info+'
'<br />index += content<br />with open(path, 'wb') as f:<br /> f.write(index.encode('utf-8'))<br />
結果分析與解釋
有關(guān)完整代碼,請參見(jiàn)微信2. py
運行代碼:
1<br />
python https://mp.weixin.qq.com/s/QAwrisNuu1dThFbs__wF_Q<br />
檢索到的index.html如下: