【千锋Python2205班10.18笔记-day02-requests和bs4-(一阶段)】

#01-review

1.什么是爬虫

##2.爬虫的工作

1)获取网页数据(requests、selenium) -

反爬

2)解析数据(正则、bs4(css选择器)、lxml(xpath))

3)保存数据(csv)

3.网页开发(html、css、js)

css选择器:
元素选择器
id选择器
class选择器
后代选择器

02-用正则解析贝壳租房

import requests
from re import findall

response = requests.get('https://cd.zu.ke.com/zufang')

print(response.text)
names = findall(r'<img\s+alt="(.+)"', response.text)
prices = findall(r'<span class="content__list--item-price"><em>(\d+)</em> 元/月</span>', response.text)
areas = findall(r'</i>\s*(\d+\.\d+)㎡\s*<i>', response.text)

result = map(lambda i1, i2, i3: {'name': i1, 'price': i2, 'area': i3}, names, prices, areas)
print(list(result))

03-requests使用详解

import requests

1.发送请求

requests.get(请求地址) -

直接获取请求地址对应的数据(请求对象没有要求是浏览器的时候)

requests.get(请求地址, headers=请求头) -

直接获取请求地址对应的数据,并且通过请求头完成浏览器伪装

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}

response = requests.get('https://movie.douban.com/top250', headers=headers)

2.获取请求结果

1)直接打印响应对象,如果状态码不是200表示请求失败

print(response)         # <Response [418]>、<Response [200]>

2)获取状态码

print(response.status_code)

3)设置编码方式(在请求结果中有乱码的时候设置, 设置成网页源代码中charset的值)

response.encoding = 'utf-8'

4) 获取响应头(可以查看服务器信息和返回的数据相关信息)

print(response.headers)

5)获取请求结果(获取从服务器中返回的数据)

a.方式1: 响应对象.text -

以字符串的方式获取到数据(请求对象是网页)

print(response.text)
b.方式2:响应对象.content -

以二进制的方式获取数据(请求对象是二进制数据,比如:下载图片、下载音视频等)

print(response.content)
c.方式3:响应对象.json() -

对请求结果进行json解析返回结果(请求对象是json接口)

print(response.json())

04-请求的三种情况

import requests

1.爬网页数据 -

请求地址是网址

response = requests.get('https://cd.zu.ke.com/zufang')



if response.status_code == 200:

# 通过text获取请求结果,然后再进一步解析

     print(response.text)

2.下载图片、视频、音频 -

请求地址是图片地址、视频地址、音频地址

1)对图片地址发送请求

response = requests.get('https://img2.baidu.com/it/u=2091427528,3084959670&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800')

2)在请求成功的时候将得到的图片数据写入到文件中

if response.status_code == 200:
    f = open('files/犬夜叉.jpeg', 'wb')
    f.write(response.content)
    f.close()

3.练习:

下载贝壳租房首页所有房屋的效果图下载下来

from re import findall

1)直接对网页发送请求获取所有的图片地址

response = requests.get('https://cd.zu.ke.com/zufang')

if response.status_code == 200:

	all_image_url = findall(r'data-src="(.+)"\s+class="lazyload">', response.text)

2)遍历得到每张需要下载的图片地址,发送请求保存数据

count = 0

for x in all_image_url:

	img_response = requests.get(x)

	f = open(f'files/{count}.jpeg', 'wb')

		count += 1

		f.write(img_response.content)

		f.close()

4.对json数据接口发送请求

response = requests.get('http://api.tianapi.com/auto/index?key=c9d408fefd8ed4081a9079d0d6165d43&num=10')

result = response.json()

for x in result['newslist']:

	print(x['title'])

05-json数据

1. 什么是json

json是一种通用的数据格式(为了让不同编程语言的程序之间可以进行有效的数据交流而存在的)

json数据格式:一个json有且只有一个数据,并且唯一的这个数是json支持的数据类型的数据。

json支持的数据类型:

1)数字 -

像数学的数字一样,直接表示:89、-2.3、0.45、3e5

2)字符串 -

必须使用双引号引起来:“abc”、“你好”、“abc\n123”、“\u4e00”

3)布尔 -

true和false

4)数组 -

就是python的列表: [10, 20, true, “abc”]

5)字典 -

json中字典的键必须是字符串:{“name”: “小明”, “age”: 18}

6)空值 -

null

2.json和python的相互转换

from json import loads, dumps

1)json转Python -

loads

# loads(json格式字符串)      -       将json数据转换成对应的python数据

# 注意:json格式字符串指的是字符串内容是json数据的字符串

# "abc"

result = loads('"abc"')     # 'abc'
print(result, type(result))

result = loads('[10, 20, "你好", true, null]')
print(result)       # [10, 20, '你好', True, None]

2)python转json

# dumps(python数据)   -   将python数据转换成对应的json格式字符串

dumps('abc')       # '"abc"'
dumps(10)          # '10'
dumps([10, 'abc', None, False])         # '[10, "abc", null, false]'
dumps({'a': 10, 10: 20, 'c': 'd'})     # '{"a": 10, "10": 20, "c": "d"}'

06-bs4网页数据解析

import requests

使用bs4安装第三方库的时候安装的是:beautifulsoup4

from bs4 import BeautifulSoup

1.基于网页源代码创建BeautifulSoup对象

# BeautifulSoup(网页源代码, 'lxml')

html = open('data.html').read()
soup = BeautifulSoup(html, 'lxml')

2.基于css选择器解析数据:获取标签 -> 获取标签内容和标签属性

1)获取标签

# BeautifulSoup对象.select(css选择器)        -   获取整个网页中css选择器选中的所有标签;返回一个列表,列表中元素是标签对象

# BeautifulSoup对象.select_one(css选择器)    -   获取整个网页中css选择器选中的第一个标签;返回一个标签对象

# 标签对象.select(css选择器)       -       获取指定标签中css选择器选中的所有标签

# 标签对象.select_one(css选择器)   -       获取指定标签中css选择器选中的第一个标签

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

result = soup.select('.c1')
print(result)

result = soup.select('#p1')
print(result)

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

result = soup.select('div p')
print(result)


result = soup.select_one('p')
print(result)

print('------------------------------------------华丽的分割线------------------------------------------------')
div = soup.select_one('div')
result = div.select('p')
print(result)

span = soup.select_one('#s1')
result = span.select('p')
print(result)

2)获取标签内容和标签属性

# 标签对象.text     -       获取标签内容

# 标签对象.attrs[属性名]       -       获取指定标签中指定属性的值

a = soup.select_one('div>div>a')
print(a, a.text)

img = soup.select_one('img')
print(img, img.attrs['alt'], img.attrs['src'])

07-bs4解析豆瓣电影

import requests
from bs4 import BeautifulSoup

1. 获取网页数据

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
response = requests.get('https://movie.douban.com/top250', headers=headers)
html = response.text

2. 解析数据

soup = BeautifulSoup(html, 'lxml')

div_list = soup.select('.grid_view>li>.item')
print(div_list)

for div in div_list:
    title = div.select_one('.title').text
    comment = div.select('.star>span')[-1].text
    score = div.select_one('.star>.rating_num').text
    print(title, comment, score)
    

data.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p class="c1">我是段落1</p>
    <a href="">我是超链接1</a>
    <div>
        <a href="" class="c1 c2">我是超链接2</a>
        <span>我是span1</span>
        <div>
            <p class="c2">我是段落2</p>
            <span id="s1">
                <p id="p1">我是段落3</p>
            </span>
            <a href="">第1名</a>
            <img src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" alt="肖生克的救赎">
        </div>
    </div>

</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值