1. 程式人生 > >爬取noi官網所有題目分析

爬取noi官網所有題目分析

最近自學,寫了幾個小指令碼,一個指令碼是爬取某東全網的所有資料,但是由於這個比較費時間 = =資料量也有點兒大。沒具體爬一波,就爬了幾個分類。

今天這個小專案,是爬取noi的官網的所有題目,其實題目量比較小了,一個多小時也就寫完了,才幾百個,和jd官網的幾千萬差距是有點兒大的。

現分析一下怎麼爬取的,在貼上一波程式碼。

第一步:觀察網頁

先觀察一波noi的官網的網頁的題目分類。

大概就是這樣子了,在主頁上只展示了標題如1.1,1.2,1.3...的標題,標題下面顯示了部分題目。很顯然這些題目的爬取還不夠。太少。我們的目的是獲取每一個title的連結,為了跳到下一個網頁上。

第二步:分析第一個網頁

開啟goole瀏覽器的開發者模式,分析一波題目連結

我們的任務就是爬取第一個官方主頁的所有title連結,用於我們獲取下一頁的所有題目頁。

輸入連結,很明顯,我們的猜想是正確的。

第三步:分析第二個頁面的題目連結

 

第二個頁面獲取所有的地址連結用於我們跳到第三個頁面。

第四步:分析題目頁的網頁 

題目分析完了,下一步就是粘一波程式碼了。

第五步:爬取noi所有題目 

程式碼部分:

import requests
from bs4 import BeautifulSoup


def get_page_one():
    headers = {
        'Cookie': 'PHPSESSID=9k52q5kv00l4m29nvbf55m08j7',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/70.0.3538.77 Safari/537.36',
        'Host': 'noi.openjudge.cn',
        'Connection': 'keep-alive'
    }
    url = 'http://noi.openjudge.cn'
    response = requests.get(url, headers=headers)
    # print(response.text)
    try:
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            return response.text
        return None
    except Exception as e:
        print(e)
        return None


def get_page_two(href):
    headers = {
        'Cookie': 'PHPSESSID=9k52q5kv00l4m29nvbf55m08j7',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/70.0.3538.77 Safari/537.36',
        'Host': 'noi.openjudge.cn',
        'Connection': 'keep-alive'
    }
    url = 'http://noi.openjudge.cn' + href
    response = requests.get(url, headers=headers)
    # print(response.text)
    try:
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            return response.text
        return None
    except Exception as e:
        print(e)
        return None


def get_page_three(href):
    headers = {
        'Cookie': 'PHPSESSID=9k52q5kv00l4m29nvbf55m08j7',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/70.0.3538.77 Safari/537.36',
        'Host': 'noi.openjudge.cn',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
    url = 'http://noi.openjudge.cn' + href
    response = requests.get(url, headers=headers)
    try:
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            return response.text
        return None
    except Exception as e:
        print(e)
        return None


def parse_html_href_one(html):
    soup = BeautifulSoup(html, 'lxml')
    storge = list()
    for ul in soup.select('.practice-info h3 a'):
        storge.append(ul['href'])
    return storge


def parse_html_href_two(html_two):
    count = 0
    storge_two = list()
    storge_three = list()
    for i in html_two:
        htmls = get_page_two(i)
        soup = BeautifulSoup(htmls, 'lxml')
        for ul in soup.select('.title a'):
            storge_two.append(ul['href'])
            storge_three.append(ul.get_text())
            count += 1
    print('一共有題目{}'.format(count))
    return storge_two, storge_three


def parse_html_href_three(html_three, html_four):
    count = 0
    for i in html_three:
        count += 1
        htmls = get_page_three(i)
        soup = BeautifulSoup(htmls, 'lxml')
        for ul in soup.select('.problem-content'):
            write_to_file(ul.get_text(), str(html_four[count - 1]))
            print(ul.get_text())
        print('-----------------------')


def write_to_file(content, number):
    try:
        with open('{}.txt'.format(number), 'w') as file:
            file.write(content)
    except Exception as e:
        print(e)


def start():
    href = parse_html_href_one(get_page_one())
    href_two, href_three = parse_html_href_two(href)
    parse_html_href_three(href_two, href_three)


if __name__ == '__main__':
    start()

以上就是我爬取noi的程式碼的指令碼。

各位如有需求自行下載。這是我學習爬取時候的一個小練習,各位如想轉發,請在轉發時提及在下的名稱就好。如有另外思路,互相交流,在下還有爬取某東全網所有品牌所有資料的指令碼。後續可能會寫部落格分享一波。