爬虫入门 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)

posted @   咸鱼QwQ  阅读(379)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示