文章目錄
- 一.爬蟲簡介
- 二.簡單爬蟲架構(gòu)
- 三.URL管理器
- 3.1 url管理器應(yīng)具有的最小功能:
- 3.2 實現(xiàn)方式
- 四.網(wǎng)頁下載器
- 4.1 urllib簡單的獲取一個網(wǎng)頁。
- 4.2 使用Request
- 4.3 添加特殊情景的處理
- 五.網(wǎng)頁解析器
- 5.1 安裝beautifulsoup4
- 5.2 beautifulsoup語法
- 5.3 示例代碼:
- 六.完整實例
- 6.1 分析目標(biāo)
為什么是輕量級爬蟲?因為復(fù)雜的爬蟲需要考慮的場景和問題非常的多,比如有些網(wǎng)頁需要登錄后才能訪問、而有些網(wǎng)頁使用javascript異步加載完成。輕量級爬蟲爬取的是不需要登錄的靜態(tài)網(wǎng)頁抓取。
一.爬蟲簡介
- 爬蟲是一段自動抓取互聯(lián)網(wǎng)信息的程序,從一個url觸發(fā)訪問所關(guān)聯(lián)的所有url,并且從每個頁面中提取出有價值的數(shù)據(jù)。
- 價值:互聯(lián)網(wǎng)數(shù)據(jù),為我所用??梢詫?shù)據(jù)進(jìn)行分析,甚至可以基于數(shù)據(jù)做出自己的產(chǎn)品,比如更專業(yè)的新聞閱讀聚合器,最爆笑故事app,最漂亮美女圖片網(wǎng),圖書對比價格網(wǎng),python技術(shù)文章大全。
二.簡單爬蟲架構(gòu)
首先需要一個爬蟲調(diào)度端,來啟動爬蟲、停止爬蟲、或者監(jiān)視爬蟲的運行情況。在爬蟲架構(gòu)中有三個模塊:
- URL管理器:將要爬取的URL和已經(jīng)爬取過的URL
- 網(wǎng)頁下載器:將網(wǎng)頁下載下來存儲成一個字符串
- 網(wǎng)頁解析器:解析字符串,一方面提取有價值的數(shù)據(jù),另一方面提取訪問其他頁面的URL
三.URL管理器
管理待抓取URL集合和已抓取URL集合,防止重復(fù)抓取、循環(huán)抓取。
3.1 url管理器應(yīng)具有的最小功能:
- 添加新url到待爬取集合
- 判斷待添加url是否在容器中
- 判斷是否還有待爬取url
- 獲取待爬取url
- 將url從待爬取移動到已爬取
3.2 實現(xiàn)方式
- 放在內(nèi)存中set()集合。待爬取set(),已爬取set()
- 存放在關(guān)系數(shù)據(jù)庫中urls(url,is_crawled)
- 存放在緩存數(shù)據(jù)庫中,比如redis,本身支持set數(shù)據(jù)結(jié)構(gòu)。大公司一般都使用緩存數(shù)據(jù)庫
四.網(wǎng)頁下載器
將互聯(lián)網(wǎng)上URL對應(yīng)的網(wǎng)頁下載到本地的工具
- urllib.request:直接的網(wǎng)頁下載,或者提交一些向網(wǎng)業(yè)輸入的數(shù)據(jù),甚至支持需要登錄網(wǎng)頁的cookie處理,需要代理訪問的代理處理等。
- requests:第三方包,提供更強大的功能
4.1 urllib簡單的獲取一個網(wǎng)頁。
爬取百度首頁就出錯。。。試了幾種方法,只有(‘gbk’,‘ignore’)有用,并且是偶爾正常顯示。爬取其他網(wǎng)頁就很順利,不知道是百度厲害,還是代碼太low。最終解決,在第一行添加如下代碼即可。。。不過也是是好是壞。
# -*- coding: UTF-8 -*-
或
#coding=utf-8
-
urlopen()參數(shù)
- url: 需要打開的網(wǎng)址
- data:Post提交的數(shù)據(jù)
- timeout:設(shè)置網(wǎng)站的訪問超時時間,單位秒
-
urlopen返回對象提供方法:
- read() , readline() ,readlines() , fileno() , close() :對HTTPResponse類型數(shù)據(jù)進(jìn)行操作
- info():返回HTTPMessage對象,表示遠(yuǎn)程服務(wù)器返回的頭信息
- getcode():返回Http狀態(tài)碼。如果是http請求,200請求成功完成;404網(wǎng)址未找到
- geturl():返回請求的url
4.2 使用Request
-
用來包裝頭部的數(shù)據(jù):
- User-Agent :這個頭部可以攜帶如下幾條信息:瀏覽器名和版本號、操作系統(tǒng)名和版本號、默認(rèn)語言
- Referer:可以用來防止盜鏈,有一些網(wǎng)站圖片顯示來源http://***.com,就是檢查Referer來鑒定的
- Connection:表示連接狀態(tài),記錄Session的狀態(tài)。
4.3 添加特殊情景的處理
HTTPCookieProcessor,ProxyHandler,HTTPHandler,HTTPRedirectHandler生成handler
# -*- coding: UTF-8 -*-
import urllib.request
from http import cookiejar
url = "http://www.baidu.com"
print("第一種方法")
response1 = urllib.request.urlopen(url)
print(response1.getcode())
print(len(response1.read()))
print("第二種方法")
request=urllib.request.Request(url)
request.add_header("user-agent","Mozilla/5.0")
response2=urllib.request.urlopen(request)
print(response2.getcode())
print (len(response2.read()))
print("第三種方法")
cj=cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(opener)
response3=urllib.request.urlopen(url)
print(response3.getcode())
print(cj)
print(response3.read())
五.網(wǎng)頁解析器
從網(wǎng)頁中提取有價值的數(shù)據(jù)的工具
- 正則表達(dá)式,字符串匹配的模糊匹配,比較直觀,但是麻煩
- html.parser自帶
- Beautifulsoup插件,結(jié)構(gòu)化解析-DOM樹
- lxml插件
5.1 安裝beautifulsoup4
可以import bs4即安裝成功。查看官方文檔
5.2 beautifulsoup語法
創(chuàng)建Beautifulsoup對象,搜索節(jié)點find_all、find(參數(shù)一樣),訪問節(jié)點名稱、屬性、文字
例如:
python
節(jié)點名稱:a
節(jié)點屬性:href='123.html' class='article_link'
節(jié)點內(nèi)容:python
#創(chuàng)建
soup = BeautifulSoup(html_cont, 'html.parser',from_encoding='utf-8')
#查找節(jié)點a
soup.find_all('a')
#查找節(jié)點a,鏈接符合/view/123.html形式的節(jié)點
soup.find_all('a',herf='/view/123.html')
soup.find_all('a',herf=re.compile(r'/view/\d+\.html'))#可以用正則表達(dá)式替代
#查找節(jié)點div,class為abc,文字為python的節(jié)點
node = soup.find_all('div',class_='abc', string='python')
#訪問節(jié)點信息
node.name #標(biāo)簽名稱
node['href'] #標(biāo)簽屬性
node.get_text() #文字內(nèi)容
5.3 示例代碼:
# coding=utf8
from bs4 import BeautifulSoup
import re
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie
,
Lacie
and
Tillie
;
and they lived at the bottom of a well.
...
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print("打印所有內(nèi)容")
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text())
print("獲取lacie的連接")
link_node = soup.find('a',)
print(link_node.name, link_node['href'], link_node.get_text())
print("正則匹配")
link_node = soup.find('a',href=re.compile(r"ill"))
print(link_node.name, link_node['href'], link_node.get_text())
print("獲取段落文字")
p_node = soup.find('p',class_="title")
print(p_node.name, p_node.get_text())
六.完整實例
- 目標(biāo):抓取百度百科Python詞條相關(guān)的1000條頁面數(shù)據(jù)。
- 分析目標(biāo):URL格式,數(shù)據(jù)格式,網(wǎng)頁編碼
- 編寫代碼
- 最后執(zhí)行爬蟲
6.1 分析目標(biāo)
- 目標(biāo):百度百科python詞條相關(guān)詞條網(wǎng)頁-標(biāo)題和簡介
- 入口頁:https://baike.baidu.com/item/Python/407313
- url格式:/item/接口/15422203
- 數(shù)據(jù)格式:
- 標(biāo)題
...
...
- 簡介
...
- 頁面編碼:UTF-8
查看代碼
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

