【千锋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 findallresponse = requests.get('https://cd.zu.ke.com/zufang')print(response.text)
names = findall(r'
, response.text)
prices = findall(r'(\d+) 元/月', response.text)
areas = findall(r'\s*(\d+\.\d+)㎡\s*', 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) # 、
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 = 0for x in all_image_url:img_response = requests.get(x)f = open(f'files/{count}.jpeg', 'wb')count += 1f.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').textcomment = div.select('.star>span')[-1].textscore = div.select_one('.star>.rating_num').textprint(title, comment, score)
data.html
DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><p class="c1">我是段落1p><a href="">我是超链接1a><div><a href="" class="c1 c2">我是超链接2a><span>我是span1span><div><p class="c2">我是段落2p><span id="s1"><p id="p1">我是段落3p>span><a href="">第1名a><img src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" alt="肖生克的救赎">div>div>body>
html>
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
