day16-requests的基本用法

requests的用法

运行环境:import requests

def get_web_data(url: str):
    # 1. 发送请求获取响应
    # requests.get(目标地址)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }
    response = requests.get(url, headers=headers)

    # 如果网页中乱码:
    # 在网页内容打印结果找meta标签中的charset属性,将响应的encoding的值设置成charset属性的值
    # response.encoding = 'gbk'

    # 2.获取数据(请求结果,爬取的内容)
    # 1) 响应.text    -    用网页爬取结果
    print(response.text)


if __name__ == '__main__':
    get_web_data('https://movie.douban.com/top250')

网页开发

前端三大技术: html + css + js

1. html - 负责网页内容的显示

一个网页就是html标签(一个网页是一个html文件);
html是通过各种各样的标签来提供各种内容,包括:文字、图片、超链接、视频、音频、输入框、按钮等。
标签内容 - 可以是纯文字,也可以是一个或者多个其他标签

2. html核心语法 - 标签

标签分为两种:单标签、双标签

  1. 双标签: <标签名 属性1=“值1” 属性2=“值2” …>标签内容</标签名>
  2. 单标签: <标签名 属性1=“值1” 属性2=“值2” …> 或者 <标签名 属性1=“值1” 属性2=“值2” …/>

3. 网页结构: 一个网页是一个html标签,里面有两个子标签分别是head标签和body

<html>
  <head>
  </head>
  <body>
  </body>
</html>
<html>
  <head>
    <meta charset="utf-8">
    <title>余婷的网页</title>
    <link rel="icon" href="files/luffy.jpg">
  </head>

  <body>
    <!-- 1. 标题标签:h1~h2 -->
    <h1>你好!</h1>
    <h2>二级标题</h2>
    <h3>三级标题</h3>
    <h6>六级标题</h6>

    <!--  2.超链接:a  -->
    <a href="https://www.baidu.com">百度</a>

    <!--  3.图片标签:img  -->
    <img src="./files/luffy.jpg">
    <img src="http://pic.rmb.bdstatic.com/bjh/news/e73e83467ae1afa2d8624661d7e5f7c8.jpeg" alt="">

    <!-- 4.普通文字标签: p、span、div-->
    <p>豆瓣用户每天都在对“看过”的电影进行“很差”到“力荐”的评价,豆瓣根据每部影片看过的人数以及该影片所得的评价等综合数据,通过算法分析产生豆瓣电影 Top 250。</p>
    <p>导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...</p>
    <p>我是p标签1</p>
    <p>我是p标签2</p>
    <span>我是一段普通文字1</span>
    <span>我是一段普通文字2</span>
    <div>
      我又是一段文字
    </div>

    <input type="text">
    <input type="password">
    <input type="checkbox"><span>我没看过</span>
    <input type="button" value="确定">
    <button>确定</button>

    <select name="" id="">
      <option value="成都">成都</option>
      <option value="重庆">重庆</option>
      <option value="重庆">北京</option>
    </select>

    <p>如果有不懂的问题问<a href="https://www.baidu.com">百度</a></p>
  
    <ul>
      <li>
        <h2>Python</h2>
        <img src="https://image.baidu.com/search/detail?ct=503316480&z=undefined&tn=baiduimagedetail&ipn=d&word=python&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=undefined&hd=undefined&latest=undefined&copyright=undefined&cs=3007672121,16493484&os=3426994009,3290649938&simid=3007672121,16493484&pn=3&rn=1&di=86570&ln=1824&fr=&fmq=1635834331044_R&fm=&ic=undefined&s=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&is=0,0&istype=0&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%253A%252F%252Fs2.51cto.com%252Foss%252F201712%252F11%252Fd7bfd1805d9d1a315b0e6fe0cbc9a0dd.jpg%26refer%3Dhttp%253A%252F%252Fs2.51cto.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Djpeg%3Fsec%3D1638426330%26t%3D24d0deaa9fa2092ef857a307c01fcae1&rpstart=0&rpnum=0&adpicid=0&nojc=undefined&dyTabStr=MCwzLDEsMiw2LDQsNSw4LDcsOQ%3D%3D" alt="">
        <p>
          Python将被加入高考科目!
        </p>
      </li>

      <li>
        <h2>Java</h2>
        <img src="" alt="">
        <p>java介绍!</p>
      </li>

      <li>
        <h2>H5</h2>

      </li>
    </ul>

  </body>

</html>

css语法

css的作用:负责网页内容的样式和局部 - 对网页进行化妆

1. css语法:

选择器{属性1:属性值1;属性2:属性值2;…}

属性 - 不一样的属性决定不同的样式
选择器 - 选中标签

2.css选择器

1) 标签选择器,元素选择器
将标签名作为选择器,选中所有指定标签,例如:p{} - 选中所有p标签 img{} - 选中所有的img标签

2) id选择器
在标签的id属性前加#作为一个选择器,选中id值是指定值的标签。
例如: #abc{} - 选中id属性值为abc的标签
注意:id属性是唯一

3) class选择器,类选择器
在class属性前加 . 作为一个选择器,选中class属性值是指定值的标签
例如: . x{} - 选中class属性值为x的标签
注意:同一个class属性值可以有多个;同一个标签可以有多个class
.x.y{} - 选中class属性值同时包含x和y的标签

4) 群组选择器
将多个独立的选择器用逗号隔开作为一个选择器,选中每个独立选择器选中的内容
例如:
a,p{} - 选中所有的a标签和p标签
#p1,.c1 - 选中id值为p1和class值为c1的标签
a,.c1,.c2 - 选中所有的a标签和class值为c1和c2的标签

5) 后代选择器
将多个独立的选择器用空格隔开作为一个选择器
div p{} - 选中在div中的p标签(p只要是div的后代就行)

6) 子代选择器
将多个独立的选择器用 > 隔开作为一个选择器
div>p{} - 选中在div中的p标签(p必须是div的子代就行)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #abc,.c1{
            color:red;
        }
<!--   #jSearchHeroDiv>li>a>p   #jSearchHeroDiv p-->
    </style>
</head>
<body>
    <!--  c1和c2都是 '我是段落1' 这个p标签的class值 -->
    <p class="c1 c2 c3">我是段落1</p>
    <a href="" class="c2">我是超链接1</a>
    <p id="abc">我是段落2</p>
    <p>我是段落3</p>
    <a href="" class="c1">我是超链接2</a>

    <div id="box">
        <p>段落11</p>
        <div class="c2">
            <a href="">超链接33</a>
            <ul>
                <li>
                    <p>我是电影名称</p>
                    <a href="">超链接11</a>
                </li>
                <li>
                    <a href="">超链接22</a>
                </li>
            </ul>
            <p>段落22</p>
        </div>
        <div class="c1">
            <p>段落33</p>
        </div>
    </div>

</body>
</html>

bs4网页解析语法

运行环境:from bs4 import BeautifulSoup

0. 获取网页内容

content = open(‘网页.html’).read()
print(content)

1. 通过网页内容创建BeautifulSoup对象(这儿的网页内容就是需要解析网页数据)

BeautifulSoup(html代码, ‘lxml’)
soup就相当于html标签
soup = BeautifulSoup(content, ‘lxml’)
print(soup)

2. 获取标签

标签对象.select(css选择器) - 返回选择器选中的所有标签,返回一个列表,列表中的元素是标签对象
标签对象.select_one(css选择器) - 返回选择器选中的第一个标签,返回一个标签对象

result = soup.select('p')
print(result)       # [<p>什么都卖!</p>, <p>泡面</p>, <p>火腿肠</p>, <p>可乐</p>]

result = soup.select_one('p')
print(result)       # <p>什么都卖!</p>

练习:获取所有商品名称对应的标签

result = soup.select('li>p')
print(result)

# select_one、select前面的标签决定查找范围:在指定标签中通过选择器获取标签
li1 = soup.select_one('li')
result = li1.select('p')
print(result)       # [<p>泡面</p>]

3. 获取双标签标签内容

标签对象.text - 获取指定标签的内容

p1 = soup.select_one('p')
print(p1.text)      # 什么都卖!

# for tag in soup.select('p'):
#     print(tag.text)
result = [x.text for x in soup.select('p')]
print(result)

4.获取标签属性

标签对象.attrs[属性名]
注意:标签对象.attrs返回的是一个字典,标签的每个属性就是一个键值对

img = soup.select_one('img')
img_url = img.attrs['src']

for x in soup.select('img'):
    print(x.attrs['src'])

练习:获取网页中所有商品的信息

all_li = soup.select('li')
all_data = []
for li in all_li:
    data = {}
    data['name'] = li.select_one('p').text
    data['price'] = float(li.select_one('.price').text[1:])
    data['img'] = li.select_one('img').attrs['src']
    all_data.append(data)

print(all_data)

豆瓣电影爬取

运行环境:import requests
from bs4 import BeautifulSoup

1. 获取网页内容

def get_net_data(url: str):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    return response.text


def analysis_data(html: str):
    soup = BeautifulSoup(html, 'lxml')
    all_li = soup.select('ol>li')
    all_data = []
    for li in all_li:
        data = {}
        # 电影名称
        name = li.select_one('.title').text
        data['name'] = name
        # 评分
        score = li.select_one('.rating_num').text
        data['score'] = float(score)
        # 总结
        message = li.select_one('.inq').text
        data['message'] = message
        # 图片地址
        pic_url = li.select_one('.pic img').attrs['src']
        data['url'] = pic_url

        all_data.append(data)

    return all_data


if __name__ == '__main__':
    result = get_net_data('https://movie.douban.com/top250')
    result = analysis_data(result)
    print(result)
上一篇:Python requests发送multipart/form-data请求


下一篇:requests Python笔记(一)