開發輕量級的爬蟲,不需要登錄的靜態網頁的爬取:
1,爬蟲的簡介:
2,簡單的爬蟲架構:
3,url管理器的實現方法:
*實現方式:
1,內存:
python內存;
等待爬取的URL集合:set()
已經爬取的URL集合:set()
2,關係數據庫
MySQL
urls(url, is _crawled)
3,緩存數據庫
redis
等待爬取的URL集合:set
已經爬取的URL集合:set
4,網頁下載器:
*urllib2下載網頁方法1:最簡潔的方法
import urllib2
# 直接請求
response= urllib2.urlopen('http://www.baidu.com')
# 獲取狀態碼,如果是200表示獲取成功
Printresponse.getcode()
# 讀取內容
cout = response.read()
*urllib2下載網頁方法2:添加data, http header
import urllib2
#創建Request對象
request = urllib2.Request(ur1)
#添加數據
request.add_data('a','1')
#添加http的header
request.add.header('user-Agent','Mozilla/5.0')
*urllib2下載網頁方法3 :添加特殊情景的處理器
#增強cookie的處理
import urllib2, cookielib
#創建cookie容器
cj =cookielib.CookieJar()
#創建一個opener
opener =urllinb2.build_opener(urllib2.HTTPCookieProcessor(cj))
#使用帶有cookie的urllib2訪問網頁
response = urllib2.urlopen("http://www.baidu.com/")
5,網頁解析器;
Python的4種網頁解析器
2017年2月1日
22:50
*正則表達式:
1:將網頁文檔作爲一個字符串,然後通過模糊匹配的方式來提取出有價值的數據。
2:優點;直觀。
3:缺點;如果文檔比較複雜的話,這種方法非常的麻煩。
*python自帶的html,parser模塊來解析網頁:
*第三方插件BeautifulSoup解析網頁:
#可以使用html,parser模塊和Ixml解析器來解析網頁
#BeautifulSoup語法:
& 創建BeautifulSoup的對象,--->搜索find_all,find,--->訪問節點名稱<a>,屬性(href='123.html',class='artice_link'),文字(節點內容:Python);
& 代碼:
frombs4 import BeautifulSoup
import re
#根據HTml網頁字符串創建BeautifulSoup對象
soup = BeautifulSoup(
html_doc, # HTML文檔字符串
'html.parser' # HTML解析器
from_encoding = 'utf8'# HTML文檔的編碼
)
#搜索節點(find_all,find) 方法:find_all(name, attrs, string)
#查找所有標籤爲a的節點
soup.find_all('a')
#查找所有標籤爲a,鏈接符合/view/123.html形式的節點
soup.find_all('a', href = '/view/123.html')
soup.find_all('a', href = re,compile(r'/view/\d+\.html') )
#查找所有標籤爲div, class爲abc, 文字爲Python的節點
soup.find_all('div', class_='abc', string = 'python' )
#訪問節點信息 得到節點:<a hef ='1.html'>python</a>
#獲取查找到的節點的標籤的名稱
node.name
#獲取查找到的節點的href屬性
node['href']
#獲取查找到的a節點的鏈接文字
node.get_text()
*第三方插件Ixml解析html網頁或者xml網頁
#後3種方法是一種結構化的解析,第一種是字符串的模糊匹配
6,實例爬蟲--分析目標
- 目標:百度百科python詞條相關詞條頁面—標題和簡介
- 入口頁:http://baike.baidu.com/view/21087.htm
- URL格式:
—詞條頁面URL:/view/125370.htm
- 數據結構
—標題:
* <ddclass ="lemmaWagt-lemmaTitle-title"><h1>***<h1></dd>
—簡介:
*<divclass = "lemma-summary">***<div>
- 頁面編碼:utf-8