爬取noi官網所有題目分析
阿新 • • 發佈:2018-12-20
最近自學,寫了幾個小指令碼,一個指令碼是爬取某東全網的所有資料,但是由於這個比較費時間 = =資料量也有點兒大。沒具體爬一波,就爬了幾個分類。
今天這個小專案,是爬取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的程式碼的指令碼。
各位如有需求自行下載。這是我學習爬取時候的一個小練習,各位如想轉發,請在轉發時提及在下的名稱就好。如有另外思路,互相交流,在下還有爬取某東全網所有品牌所有資料的指令碼。後續可能會寫部落格分享一波。