爬蟲系列 | 基于百度爬蟲的非百度搜索引擎
? ? 點擊上方?月小水長?并?設為星標,第一時間接收干貨推送
這是本項目的開篇,在這個小項目中,將要基于爬蟲和GUI編程寫一個寫個小工具,目的是不用打開瀏覽器,也能搜到一些關鍵信息,并將這些信息持久化保存下來,讀者可以對這些數(shù)據(jù)進行分析,比如輿情分析,或作為 NLP 的語料輸入。
眾所周知,搜索引擎的一個核心技術就是爬蟲技術,各大搜索引擎的爬蟲將個網(wǎng)站的快照索引起來 ,用戶搜索時,輸入關鍵詞并回車后,基于搜索引擎的瀏覽器就將相關信息按照一定排序規(guī)則展現(xiàn)給用戶,今天分享的這個爬蟲,是爬取百度爬蟲爬取的內容,聽起來,有點像俄羅斯套娃。
話不多說,先用一張圖,說明要爬取的內容

如圖,爬取的目標是百度咨詢下的每一條內容,包括標題、來源、時間和內容,并且翻頁爬取、爬完能夠自動停止,而且能夠按照焦點/時間排序。
經過調試分析,發(fā)現(xiàn)排序規(guī)則和參數(shù) rtt 相關,rtt = 1 是按照焦點排序,rtt = 4 是按照時間排序,這樣就很容易解決排序抓取的問題。
翻頁只需要控制 pn 參數(shù)即可,其值等于當前頁碼 * 10;爬完自動停止,首先要知道什么時候爬完,從上面圖中可以發(fā)現(xiàn),網(wǎng)頁上有“找到相關資訊約535,000篇”,好家伙,除以每頁 10 篇,總頁數(shù)就知道了,就知道什么時候停止了。
下面就是寫代碼逐漸實現(xiàn)的過程了。
首先備好爬蟲的原料
headers?=?{
????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/75.0.3770.142?Safari/537.36',
????'Referer':?'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=%B0%D9%B6%C8%D0%C2%CE%C5&fr=zhidao'
}
url?=?'https://www.baidu.com/s'
params?=?{
????'ie':?'utf-8',
????'medium':?0,
????#?rtt=4?按時間排序?rtt=1?按焦點排序
????'rtt':?1,
????'bsst':?1,
????'rsv_dl':?'news_t_sk',
????'cl':?2,
????'tn':?'news',
????'rsv_bp':?1,
????'oq':?'',
????'rsv_btype':?'t',
????'f':?8,
}
然后稍微小炒一下,拿到總篇數(shù),但是不能浪費這次請求,畢竟這個頁面上也有 10 篇文章需要解析,所以第一次請求的目的是拿到停止條件同時解析前 10 篇,注意它和后面的請求處理過程多了拿到總篇數(shù)這個過程,所以不放在后面的循環(huán)里。
response?=?requests.get(url=url,?params=params,?headers=headers)
html?=?etree.HTML(response.text)
dealHtml(html)
total?=?html.xpath('//div[@id="header_top_bar"]/span/text()')[0]
total?=?total.replace(',',?'')
total?=?int(total[7:-1])
pageNum?=?total?//?10
但是它的每條新聞解析過程,和后面都是一樣的,都在 dealHtml 中,注意函數(shù)中 parseTime
def?dealHtml(html):
????results?=?html.xpath('//div[@class="result-op?c-container?xpath-log?new-pmd"]')
????saveData?=?[]
????for?result?in?results:
????????title?=?result.xpath('.//h3/a')[0]
????????title?=?title.xpath('string(.)').strip()
????????summary?=?result.xpath('.//span[@class="c-font-normal?c-color-text"]')[0]
????????summary?=?summary.xpath('string(.)').strip()
????????#?./?是直接下級,.//?是直接/間接下級
????????infos?=?result.xpath('.//div[@class="news-source"]')[0]
????????source,?dateTime?=?infos.xpath(".//span[last()-1]/text()")[0],?\
???????????????????????????infos.xpath(".//span[last()]/text()")[0]
????????dateTime?=?parseTime(dateTime)
????????print('標題',?title)
????????print('來源',?source)
????????print('時間',?dateTime)
????????print('概要',?summary)
????????print('\n')
????????saveData.append({
????????????'title':?title,
????????????'source':?source,
????????????'time':?dateTime,
????????????'summary':?summary
????????})
for?page?in?range(1,pageNum):
????print('第?{}?頁\n\n'.format(page))
????headers['Referer']?=?response.url
????params['pn']?=?page*10
????response?=?requests.get(url=url,headers=headers,params=params)
????html?=?etree.HTML(response.text)
????dealHtml(html)
????sleep(randint(2,4))
很快啊,最后就是出鍋了,這道菜的名稱叫做,耗子尾汁,請君享用
with?open(fileName,?'a+',?encoding='utf-8-sig',?newline='')?as?f:
????writer?=?csv.writer(f)
????for?row?in?saveData:
????????writer.writerow([row['title'],?row['source'],?row['time'],?row['summary']])

言歸正傳,本次項目的第一部分:百度爬蟲的爬蟲,就算完成了,爬蟲所有代碼的 github 地址如下:
https://github.com/Python3Spiders/BaiduSpider
(點擊文末 閱讀原文 可直達)
本項目的下一部分,等我找好朝天椒,再爆炒上桌,莫急莫急。
往期精選
