<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          爬蟲系列 | 基于百度爬蟲的非百度搜索引擎

          共 3256字,需瀏覽 7分鐘

           ·

          2020-11-28 13:43

          ? ? 點擊上方?月小水長?并?設為星標,第一時間接收干貨推送

          這是?月小水長?的第?59?篇原創(chuàng)干貨

          這是本項目的開篇,在這個小項目中,將要基于爬蟲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
          ????????})
          然后緊接著中火慢燉,坐等美味,注意不要燒焦了,要及時加一些水或調料,動態(tài)修改頁面參數(shù)
          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

          (點擊文末 閱讀原文 可直達)

          本項目的下一部分,等我找好朝天椒,再爆炒上桌,莫急莫急。

          往期精選


          模仿騰訊新聞做了款新聞閱讀小程序


          我用 Python 寫了個基金漲跌通知助手

          瀏覽 95
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  AA黄色片视频 | 俺去也 | 日韩黄色电影网 | 色天天男人天堂 | 人人射|