1. 程式人生 > 其它 >爬蟲入門 01 request庫與bs4庫初步使用

爬蟲入門 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

https://pypi.douban.com/simple
使用:
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)