Python使用urllib2爬取百度百科

2021-08-14 16:52:35 字數 4708 閱讀 3988

url管理器主要用來管理要爬取的url,放置重複爬取

輸出,將解析後的資料輸出儲存起來

以下為**示例:

1.url管理器

#管理要爬取的url

class

urlmanager(object):

def

__init__(self):

#未爬取過的url

self.new_urls = set()

#已爬取到的url

self.old_urls = set()

#新增乙個url list到待爬取集合

def

add_new_urls(self

,urls):

if urls is

none

or len(urls) == 0:

return

for url in urls :

if url not in

self.old_urls :

self.new_urls.add(url)

#新增乙個url到待爬取集合

def

add_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)

#判斷是否還有為爬取的url

def

has_new_url(self):

return

len(self.new_urls) >0

#從集合中取出乙個要爬取的url

def

get_new_url(self):

new_url = self.new_urls.pop()

self.old_urls.add(new_url)

return new_url

2.讀取頁面內容

import urllib2

#使用python自帶的urllib2獲取爬取頁面的內容

class

html**********:

def

download(self

,url):

if url is

none:

return

none

response = urllib2.urlopen(url)

if response.getcode() != 200 :

return

none

return response.read()

3.解析內容

from bs4 import beautifulsoup

import re

import urlparse

class

htmlparser:

#將爬取到的內容中的所有url新增到待爬取集合中

def

_get_new_urls(self

,url,soup):

new_urls = set()

#只取出/item開頭的url

links = soup.find_all('a'

,href=re.compile(r"/item"))

for link in links :

new_url = link['href']

#將new_url按照傳入的url格式補齊

new_full_url = urlparse.urljoin(url,new_url)

new_urls.add(new_full_url)

return new_urls

#提取出需要的資料,表頭,簡介

def

_get_new_data(self

,url,soup):

res_data = {}

res_data['url'] = 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

#使用beautifulsoup將html內容解析成dom樹

def

parse(self

,url,html_cont):

if 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(url,soup)

new_data = self._get_new_data(url,soup)

return new_urls,new_data

4.輸出

#coding:utf8

class

htmloutputer:

def

__init__(self):

self.datas =

def

collect_data(self

,data):

if data is

none:

return

def

output_html(self):

fout = open('output.html'

,'w')

fout.write('')

fout.write('')

fout.write('')

for data in

self.datas:

fout.write('')

fout.write('%s'%data['url'].encode('utf-8'))

fout.write('%s' % data['title'].encode('utf-8'))

fout.write('%s%r' % (data['summary'].encode('utf-8') ,

'/n'))

fout.write('')

fout.write('')

fout.write('')

fout.write('')

5.入口

#coding:utf8

from baike_spider import url_mananger,html_**********,html_outputer,html_parser

class

spidermain() :

def

__init__(self):

self.urls = url_mananger.urlmanager()

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

self.parse = html_parser.htmlparser()

self.outputer = html_outputer.htmloutputer()

def

craw(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.parse.parse(new_url,html_cont)

self.urls.add_new_urls(new_urls)

self.outputer.collect_data(new_data)

count +=1

if count == 1000:

break

except

exception

, e:

print e.message

print

'craw failed'

self.outputer.output_html()

if __name__ == '__main__' :

root_url = ""

obj_spider = spidermain()

obj_spider.craw(root_url)

6.執行結果:

urllib2使用總結

urllib2庫是涉及到url資源請求的常用庫 官方文件 urllib2 extensible library for opening urls 常用函式 urllib2.urlopen url data timeout cafile capath cadefault context url 可以是...

urllib2使用總結

urllib2是python的乙個獲取urls的元件。他以urlopen函式的形式提供了乙個非常簡單的介面,具有利用不同協議獲取urls的能力,同樣提供了乙個比較複雜的介面來處理一般情況。urllib2支援獲取不同格式的urls例如 ftp gopher等,並利用它們相關網路協議進行獲取。urlli...

urllib2使用初探

在入門urllib2之前,我想應該先調研一下urllib與urllib2的區別 1 首先我們要明白的是,這兩個模組不可以相互替代.兩者都是接受url請求的模組,但是提供了不同的功能,兩個顯著的區別是 1.對於乙個url的request,urllib2.urlopen可以接受乙個request類的例項...