爬蟲入門 01 request庫與bs4庫初步使用
爬蟲概述
爬蟲:
1.百度百科
2.自己理解:
通過程式碼、模擬瀏覽器上網 然後抓取資料的過程 資料解析
2.爬蟲是否合法?
1.法律允許
2.有法律風險的
3.統一規定? 【法律界限】
robots.txt協議
4.爬蟲的分類:
1.獲取一整張頁面 【通用爬蟲】
2.獲取一整張頁面 部分資料 【聚焦爬蟲】
3.檢查頁面更新、獲取頁面最新的更新的資料 【增量式爬蟲】
5.爬蟲的規則:
1.反爬策略:
入口網站 通過 技術手段 防止爬蟲程式對頁面爬取資料
2.反 反爬策略
爬蟲程式 通過 技術手段 對頁面爬取資料
http 與 https
service 與 client 進行資料互動的一種形式
request:
User-Agent: 請求載體的身份標識
response:
Content-Type:伺服器響應client的資料型別
6.爬蟲技術
1.urllib 【老】
2.requests 【好用】
requests:
1.是什麼
python自帶的 基於網路請求的模組 功能強大 簡單高效
2.幹什麼
模擬瀏覽器傳送請求
3.怎麼用:
1.指定url
2.傳送請求【get、post】
3.獲取相應的資料
4.儲存資料
pip install requests
如何獲取一整張頁面的部分內容?
1.整個html + html資料解析【資料解析沒講】
2.獲取部分html
爬取圖片:
資料解析:
1.為什麼要進行資料解析?
1.為了獲取指定的頁面資料
html
2.資料解析分類:
1.正則 【瞭解】
2.bs4
3.xpath 【重要】 scrapy
3.解析的資料有哪些?
1.資料來源:
html
2.文字 或者 圖片 =》 html標籤裡面 或者 標籤的屬性
4.如何解析?
1.標籤定位
2.解析資料
5.聚焦爬蟲?
1.指定url
2.發起請求
3.獲取相應資料
4.資料解析
5.儲存資料
bs4:
資料解析的工具
原理:
1.標籤定位
2.解析資料
怎麼用:
1.例項化bs4類 BeautifulSoup => 載入 html
2.呼叫api 標籤定位+ 解析資料
pip install bs4 -i
使用:
bs4 api
爬蟲案例
1.單獨爬取整張頁面並儲存到本地(基礎中的基礎)
import requests if __name__ == '__main__': # 1.url url = "https://www.baidu.com/" # 2.傳送請求 resp = requests.get(url = url) # 3.獲取頁面資料 resp.encoding="utf-8" page_info = resp.text print(page_info) # 4.儲存資料 with open(r"D:\ \python-sk\data\baidu.html","w",encoding="utf-8") as fp: fp.write(page_info)
2.學會偽裝自己,夾帶引數了(基礎中的基礎)
import requests ''' User-Agent 檢查: 入口網站檢查 身份 【反爬機制】 ua偽裝 ''' if __name__ == '__main__': # 1.url url = "https://www.sogou.com/web" name = input("輸入一個搜尋詞:") params = { "query":name } # ua偽裝 => 模擬瀏覽器上網 headers = { "User-Agent":"你的ua" } # 2.傳送請求 resp = requests.get(url=url,params=params,headers=headers) # 3.獲取頁面資料 resp.encoding="utf-8" page_info = resp.text print(page_info) # 4.儲存資料 with open(f"D:\ \python-sk\data\{name}.html","w",encoding="utf-8") as fp: fp.write(page_info)
3.爬取豆瓣排行榜(基礎中的基礎)
import json
import requests
if __name__ == '__main__':
# 1.url
url = "https://movie.douban.com/j/chart/top_list"
# name = input("輸入一個搜尋詞:")
params = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent":"你的ua"
}
# 2.傳送請求
resp = requests.get(url=url,params=params,headers=headers)
# 3.獲取頁面資料
resp.encoding="utf-8"
data_json = resp.json()
print(data_json)
# 4.儲存資料
fp = open("D:\ \python-sk\data\douban.json","w",encoding="utf-8")
# 這個引數是為了不使用ask碼轉譯,直接輸出中文
json.dump(data_json,fp,ensure_ascii=False)
4.與插值字串結合,查肯德基門店
import requests
if __name__ == '__main__':
# 1.url
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"
name = input("輸入一個想要搜尋店鋪的城市:")
params = {
'cname': name,
'pid': '',
'pageIndex': '1',
'pageSize': '10'
}
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent":"你的ua"
}
# 2.傳送請求
resp = requests.get(url=url,params=params,headers=headers)
# 3.獲取頁面資料
resp.encoding="utf-8"
# KFC做的比較好,可以支援json和text兩種格式,直接用text就可以了
# Accept: application/json, text/javascript, */*; q=0.01
data_text = resp.text
print(data_text)
# 4.儲存資料
with open(f"D:\ \python-sk\data\kfc{name}.json", "w", encoding="utf-8") as fp:
fp.write(data_text)
5.進行翻譯,但是該網站有token
import json
import requests
if __name__ == '__main__':
# 1.url
url = "https://fanyi.baidu.com/sug"
kw = input("輸入一個搜尋詞:")
params = {
'kw': kw,
}
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent":"你的ua"
}
# 2.傳送請求
resp = requests.post(url=url, data=params, headers=headers)
# 3.獲取頁面資料
resp.encoding="utf-8"
data_json = resp.json()
print(data_json)
# 4.儲存資料
fp = open(f"D:\ \python-sk\data\{kw}.json","w",encoding="utf-8")
# 這個引數是為了不使用ask碼轉譯,直接輸出中文
json.dump(data_json,fp,ensure_ascii=False)
# bc8a22af34b13539bfb54c9f6176964d
# bc8a22af34b13539bfb54c9f6176964d
6.爬取圖片,結合了for迴圈
import json
import requests
if __name__ == '__main__':
for num in range(10000,20000,1000):
# 1.url
url = f"https://game.gtimg.cn/images/lol/act/img/skin/big{num}.jpg"
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent": "你的ua"
}
# 2.傳送請求
resp = requests.get(url=url, headers=headers)
# 3.獲取頁面資料
resp.encoding = "utf-8"
'''
text
json
content(bytes)
'''
jpg = resp.content
# 4.儲存資料
# 'b' binary mode
with open(rf"D:\ \python-sk\data\{num}.jpg", "w+b") as fp:
fp.write(jpg)
7.bs4庫強勢加盟
例項化bs4類 BeautifulShop
呼叫api 標籤定位 + 解析資料
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent": "你的ua"
}
fp = open(r"D:\ \python-sk\data\meizi.html","r",encoding="utf-8")
soup = BeautifulSoup(fp,"lxml")
# print(soup)
# 1.通過標籤 解析文字
'''
soup.tagname
div : 返回html中第一次出現的標籤 內容
a : 返回html中第一次出現的標籤 內容
'''
print(soup.div)
print(soup.a)
# 2.find
'''
find
1.find('div') : 返回html中第一次出現的標籤 內容
2.標籤屬性定位:find('div',class_='vrwrap')
vrcid="citeurl.6a48cb0"
'''
print(soup.find('div',class_='vrwrap'))
# 3.find_all
'''
find_all
取出所有符合條件的內容
'''
print(soup.find_all('span'))
# 4.select
'''
soup.select
1.標籤屬性值定位,取得所有符合條件範圍內的值
2.可以做層級
html:傳值class="vrwrap"要寫成 .vrwrap
'''
print(soup.select(".vrwrap"))
print(soup.select(".clamp01 > span ")[0])
# 5.取文字資料
print(soup.select(".clamp01 > span ")[0].text)
# 6.取屬性資料(舉例子)
print(soup.select(".clamp01 > span ")[0]["class"])
print(soup.find('div',class_='clamp01'))
# 7.和迴圈結合,取出文字和裡面的屬性
for el in soup.select(".clamp01 > span "):
print(el.text)
print(el["class"])
使用bs4庫爬取小說
'''
利用bs4解析一個線上的網站(bs4最後一個案例)
https://www.shicimingju.com/book/sanguoyanyi.html
需求:
爬取小說
1.章節標題
2.章節內容
'''
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
# ua偽裝 => 模擬瀏覽器上網
headers = {
"User-Agent":"你的ua"
}
# 1.通用爬蟲
# 1.url
url = "https://www.shicimingju.com/book/sanguoyanyi.html"
page_info = requests.get(url=url,headers=headers)
page_info.encoding="utf-8"
# 頁面資料
# print(page_info.text)
# 2.資料解析
soup = BeautifulSoup(page_info.text, "lxml")
# 3.標籤定位
a_list = soup.select(".book-mulu > ul > li > a")
# print(a_list)
# 4.解析資料
title = []
href = []
# 可選刪除之前文字資料
fp = open(r"D:\ \python-sk\data\book\mingzhu.txt","w",encoding="utf-8")
for el in a_list:
# title.append(el.text)
# href.append(el['href'])
title = el.text
detail_url = "https://www.shicimingju.com/"+el['href']
# 5.通用爬蟲 => 章節內容
# 1.通用爬蟲
detail_page_info = requests.get(url=detail_url,headers=headers)
detail_page_info.encoding = "utf-8"
# 2.資料解析
detail_soup = BeautifulSoup(detail_page_info.text, "lxml")
# 3.標籤定位
detail_div_tag = detail_soup.find("div",class_="chapter_content")
content = detail_div_tag.text
# print(content)
# 可能會超時
# with open(f"D:\ \python-sk\data\mingzhu\{title}.txt","w",encoding="utf-8") as fp:
# fp.write(f"{title} \n {detail_url} => \n {content} \n")
fp.write(f"{title}\n{detail_url} => \n {content} \n")
print(f"{title}\n{detail_url} => 爬取ok")
fp.close()
# print(title)
# print(href)