#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>