1.requests庫(kù)安裝
pip install requests
舉例:
>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code
200 #200表示成功
>>> r.encoding = "utf-8"
>>> r.text #打印網(wǎng)頁(yè)內(nèi)容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新聞</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地圖</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>視頻</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>貼吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登錄</a> </noscript> <script>document.write(\'<a + encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登錄</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多產(chǎn)品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>關(guān)于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必讀</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意見(jiàn)反饋</a> 京ICP證030173號(hào) <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n
這樣依许,百度的主頁(yè)已經(jīng)成功被抓取下來(lái)了。
requests的7個(gè)主要的方法
2.requests庫(kù)的get()方法
requests庫(kù)get方法的源代碼
所以,requests庫(kù)的get()方法實(shí)際上是調(diào)用requests庫(kù)的request的方法來(lái)實(shí)現(xiàn)的
所以吐葵,雖然requests庫(kù)有7中方法,但是實(shí)際上可以把它理解成一種方法桥氏,也就是request的方法温峭。
重點(diǎn)看一下response對(duì)象
原則上,r.apparent_encoding 是比r.encoding更為準(zhǔn)確的一種形式
3.爬取網(wǎng)頁(yè)的通用代碼框架
6種常見(jiàn)的requests庫(kù)的連接異常
通用代碼框架使得用戶爬取網(wǎng)頁(yè)更加可靠字支,有效凤藏,穩(wěn)定
3.HTTP協(xié)議以及request庫(kù)方法
HTTP協(xié)議:超文本傳輸協(xié)議
簡(jiǎn)單的說(shuō),就是用戶發(fā)起請(qǐng)求堕伪,服務(wù)器發(fā)生響應(yīng)揖庄,這就是簡(jiǎn)單的請(qǐng)求與響應(yīng)模式
r.headers反饋得到的頭部信息
當(dāng)試圖展示全部?jī)?nèi)容,用r.text,結(jié)果為空
4.requests庫(kù)主要方法的解析
5.爬取實(shí)例
(1)京東商品頁(yè)面的爬取
(2)亞馬遜商品頁(yè)面的爬取
亞馬遜的服務(wù)器識(shí)別了這次訪問(wèn)是由requests庫(kù)的爬蟲(chóng)引起的
所以
先構(gòu)建一個(gè)鍵值對(duì)
重新定義了user-agent欠雌,使它等于Mozilla/5.0
對(duì)headers進(jìn)行修改
這時(shí)候蹄梢,user-agent就變成了Mozilla/5.0
返回的結(jié)果
(3)百度360搜索關(guān)鍵詞提交
(4)網(wǎng)絡(luò)圖片的爬取和儲(chǔ)存
(5)IP地址歸屬地的自動(dòng)查詢
6.Beautiful Soup庫(kù)的安裝
pip install beautifulsoup4
兩種方式獲取源代碼
1是可以直接瀏覽器上查看網(wǎng)頁(yè)源代碼
2是可以用requests
除了給出demo,還需要給出一個(gè)解析demo的解釋器富俄,這里的解釋器是html.parser禁炒,也就是說(shuō)我們這里是對(duì)demo進(jìn)行html的解析
beautifulsoup庫(kù)只需要2行代碼
7.Beautiful Soup庫(kù)的基本元素
任何的html文件都是由一組尖括號(hào)組成的標(biāo)簽組織起來(lái)的,每一對(duì)尖括號(hào)構(gòu)成一個(gè)標(biāo)簽霍比,而標(biāo)簽之間存在上下游關(guān)系幕袱,形成一個(gè)標(biāo)簽樹(shù)
使用soup.title可以獲得title信息
使用soup.a獲得a標(biāo)簽的tag
當(dāng)html中包含多個(gè)相同的tag時(shí),使用soup.tag是會(huì)獲得第一個(gè)tag信息
soup.a.name獲得a標(biāo)簽的名字
soup.a.parent.name獲得a標(biāo)簽的父親的名字悠瞬,也就是包含a標(biāo)簽的上一級(jí)標(biāo)簽的名字
soup.a.parent.parent.name同理们豌,獲得的是上上級(jí)標(biāo)簽的名字
tag.attrs獲取tag的屬性信息,可以看出來(lái)它是一個(gè)字典浅妆,存在鍵值對(duì)
因此望迎,可以用
tag.attrs['class']來(lái)獲得class屬性的值
tag.attrs['href']來(lái)獲得href屬性的值
type(tag.attrs)可以獲得屬性的類型,它是一個(gè)dict
type(tag)凌外,獲取tag的類型信息
soup.a.string獲得tag a的NavigableString
可以看出辩尊,p標(biāo)簽中還包含一個(gè)b標(biāo)簽
因此,soup.tag.string可以跨標(biāo)簽獲得標(biāo)簽的NavigableString
比如
beautiful soup的comment信息
8.基于bs4庫(kù)的HTML內(nèi)容的遍歷方法
要注意的是趴乡,contents返回的是列表对省,而children和descendants返回的是迭代類型蝗拿,需要for循環(huán)輸出
9.基于bs4庫(kù)的HTML格式輸出
print之后都分行顯示
10.信息標(biāo)記的三種形式
11.三種信息標(biāo)記形式的比較
12.信息提取的一般方法
13.基于bs4庫(kù)的HTML內(nèi)容查找方法
如果給find_all的參數(shù)是True晾捏,將返回所有的標(biāo)簽信息
14.中國(guó)大學(xué)排名定向爬蟲(chóng)實(shí)例
(1)實(shí)例介紹
(2)中國(guó)大學(xué)排名定向爬蟲(chóng)實(shí)例代碼編寫(xiě)
import requests
import bs4
import requests
import bs4
import requests
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url):
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist,html):
soup = BeautifulSoup(html,'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr("td")
ulist.append([tds[0].string,tds[1].string,tds[2].string])
def printUnivList(ulist,num):
print("{:^10}\t{:^6}\t{:^10}".format("排名","學(xué)校名稱","總分"))
for i in range (num):
u = ulist[i]
print ("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
def main():
uinfo = []
url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
main()
結(jié)果如下
排名 學(xué)校名稱 總分
1 清華大學(xué) 北京市
2 北京大學(xué) 北京市
3 浙江大學(xué) 浙江省
4 上海交通大學(xué) 上海市
5 復(fù)旦大學(xué) 上海市
6 南京大學(xué) 江蘇省
7 中國(guó)科學(xué)技術(shù)大學(xué) 安徽省
8 哈爾濱工業(yè)大學(xué) 黑龍江省
9 華中科技大學(xué) 湖北省
10 中山大學(xué) 廣東省
11 東南大學(xué) 江蘇省
12 天津大學(xué) 天津市
13 同濟(jì)大學(xué) 上海市
14 北京航空航天大學(xué) 北京市
15 四川大學(xué) 四川省
16 武漢大學(xué) 湖北省
17 西安交通大學(xué) 陜西省
18 南開(kāi)大學(xué) 天津市
19 大連理工大學(xué) 遼寧省
20 山東大學(xué) 山東省
(3)中國(guó)大學(xué)排名定向爬蟲(chóng)實(shí)例優(yōu)化
問(wèn)題:
結(jié)果的中文不對(duì)齊