3月20日 Python自製簡易爬蟲框架

2021-07-29 05:22:19 字數 4453 閱讀 1315

簡易框架由以下幾個模組:

html解析器 :使用beautifulsoup對頁面內容進行解析

html輸出器 :對爬取的結果封裝成html檔案輸出

url管理器

class

urlmanager

(object):

def__init__

(self):

self.new_urls = set()

self.old_urls = set()

defadd_new_url

(self, url):

if url is

none:

return

if url not

in self.new_urls and url not

in self.old_urls:

self.new_urls.add(url)

defadd_new_urls

(self, urls):

if urls is

none

or len(urls) == 0:

return

for url in urls:

self.add_new_url(url)

defhas_new_url

(self):

return len(self.new_urls) != 0

defget_new_url

(self):

new_url = self.new_urls.pop()

self.old_urls.add(new_url)

return new_url

import urllib.request

class

html**********

(object):

defdownload

(self, url):

if url is

none:

return

none

response = urllib.request.urlopen(url)

if response.getcode() != 200:

return

none

return response.read()

html解析器

from bs4 import beautifulsoup

import re

import urllib.parse

class

htmlparser

(object):

defparse

(self, page_url, html_cont):

if page_url is

none

or html_cont is

none:

return

soup = beautifulsoup(html_cont, 'html.parser', from_encoding='utf-8')

new_urls = self._get_new_urls(page_url, soup)

new_data = self._get_new_data(page_url, soup)

return new_urls, new_data

def_get_new_urls

(self, page_url, soup):

new_urls = set()

links = soup.find_all('a', href=re.compile(r"/item/\w+"))

for link in links:

new_url = link['href']

new_full_url = urllib.parse.urljoin(page_url, new_url)

new_urls.add(new_full_url)

return new_urls

def_get_new_data

(self, page_url, soup):

res_data = {}

res_data['url'] = page_url

# title_node = soup.find('dd', class_="lemmawgt-lemmatitle-title").find('h1')

res_data['title'] = title_node.get_text()

# summary_node = soup.find('div', class_="lemma-summary")

res_data['summary'] = summary_node.get_text()

return res_data

html輸出器

class

htmloutputer

():def

__init__

(self):

self.datas =

defcollect_data

(self, data):

if data is

none:

return

defoutput_html

(self):

fout = open('output.html', 'w', encoding='utf-8')

fout.write('')

fout.write('')

fout.write('')

for data in self.datas:

fout.write('')

fout.write('%s' % data['url'])

fout.write('%s' % data['title'])

fout.write('%s' % data['summary'])

fout.write('')

fout.write('')

fout.write('')

fout.write('')

fout.close()

main

from baike_spider import html_**********

from baike_spider import html_outputer

from baike_spider import html_parser

from baike_spider import url_manager

class

spidermain

(object):

def__init__

(self):

self.urls = url_manager.urlmanager()

self.********** = html_**********.html**********()

self.parser = html_parser.htmlparser()

self.outputer = html_outputer.htmloutputer()

defcraw

(self,root_url):

count = 1

self.urls.add_new_url(root_url)

while self.urls.has_new_url():

try:

new_url = self.urls.get_new_url()

print("craw %d : %s" % (count, new_url))

html_cont = self.**********.download(new_url)

new_urls, new_data = self.parser.parse(new_url, html_cont)

self.urls.add_new_urls(new_urls)

self.outputer.collect_data(new_data)

if count == 100:

break

count += 1

except:

print("craw failed")

self.outputer.output_html()

if __name__ == "__main__":

root_url = ""

# root_url = ""

obj_spider = spidermain()

obj_spider.craw(root_url)

結果展示

3月20日總結

這周一直在做貪心的題,發現貪心的最大特點就是 讀完題目後往往沒有思路,無從下手 而當有思路後,並不會消耗太多時間。近期的題目,關聯資料比較多,往往會用到pair型別或結構體。pair型別 pair包含兩個資料值。與容器一樣,pair也是一種模板型別。但在建立pair物件時,必須提供兩個型別名。pai...

3月16日 3月20日課程表

請各位家長注意翻看課程表下方學習指導 時間 周一周二 週三周四 周五9 00 9 25 英語數學 數學語文 英語9 30 9 40 眼操眼操 眼操眼操 眼操9 40 10 00 運動運動 運動運動 運動10 00 10 25 數學英語 語文數學 語文午休 3 00 3 25 語文語文 體育美術 數學...

3月20日 3月26日 新聞採訪寫作

此外,不同的媒介聲調不一樣,在新聞選擇的時候,可能出現側重點的偏差,這是 塑造自己風格的途徑之一,記者在選擇新聞時應該慎重考慮 二 新聞敏感 新聞鼻 1 什麼時新聞敏感 新聞工作者及時識別新近發生的事實是否具有新聞價值的能力。這是記者最基本的業務素質 2 新聞敏感的內涵 1 迅速判斷某一心事事實對當...