爬虫
爬虫
(网络数据采集)
按照程序员的想法,由程序员自定义规则编写程序批量的爬取数据(图片。音频、视频、数据等)
爬虫的流程
- 解析HTML页面
- 根据前端的语法或者正则表达式提取数据
- 保存数据
requests
、urllib
、playwariter
等
-
requests
: 通过网址向服务器发送请求,等待服务器的响应结果安装
pip install requests
requests的使用
import requests
# URL = 'https://www.bilibili.com/'
URL = 'https://https://pvp.qq.com/web201706/index.shtml'
# 向B站发送请求,获取B站服务器的响应结果
# resp = response(响应)
resp = requests.get(url=URL)
print(resp) # <Response [200]>
# status_code: 状态码 --> 判断服务器和网页的状态
# 200: 表示程序和服务器正常通信
# 403: 表示服务器理解客户端的请求,但是拒绝了客户端的请求
# 404: 网页丢失
# 500: 服务器崩溃
# print(resp.status_code) # 200
#
如果网页发生乱码,只需要根据页面指定编码方式解码即可
request默认使用ISO-8869,ASCII
其也能使用服务器所指定的编码方法
resp.p.encoging= 'gbk'
# test: 页面源代码(字符串类型)
# print(resp.text, type(resp.text)) # </html> <class 'str'>
# UTF-8(万国码、gbk(国标码)
# content: 页面源代码(二进制形式(字节))
# b'.....' --> 图片、音频、视频
图片下载
import requests
# URL = 'https://game.gtimg.cn/images/yxzj/cp/a20220530bbztz/cn4_ren.png' # (图片连接地址)
URL = 'https://video.pearvideo.com/mp4/adshort/20220614/cont-1765337-15895934_adpkg-ad_hd.mp4' # (图片连接地址)
response = requests.get(url=URL)
if response.status_code == 200:
print(response.content)
# 将图片写入本地文件
# photo = open('1.jpg', 'wb')
video = open('1.mp4', 'wb')
# photo.write(response.content)
video.write(response.content)
# photo.close()
video.close()
else:
print(f'状态码:{response.status_code}')
BeautifulSoup4解析页面
爬虫的伪装
-
headers
是给爬虫提供伪装的 -
headers = {}
--> headers是一个字典:{key:value}
-
User-Agent
--> 将爬虫伪装成浏览器
import requests
URL = 'https://movie.douban.com'
# URL = 'https://101.qq.com/#/hero'
# Headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44'
# }
response = requests.get(url=URL)
print(response)
BeautifulSoup4
BeautifulSoup4
- 根据响应结果解析页面,提取数据
bs4
-> BeautifulSoup4
bs4
模块能够从html
或者xml
中提取数据
网页分为静态网页和动态网页
- 静态页面:内容的写死的,除非人为的进行内容修改,否则这个页面的内容是一成不变的。
- 动态页面:内容不是写死的,使用某种特殊的技术(JavaScript)使页面中的数据通过某种方式显示在页面中
requests
得到的结果是静态页面的结果。(网页源代码)
网页的开发者工具中elements
得到的结果可能是伪代码,是网页完全加载完后的代码,和requests
得到的结果可能不一致
BeautifulSoup
(网页源码, 解析器) --> 将字符串类型的源代码转换为bs4
类型
bs
模块提供了一系列提取数据的方法,这些方法的操作对象的**bs4
类型的数据**
# requests - 请求页面,得到响应结果
# 写入文件、数据库
import requests
from bs4 import BeautifulSoup
for page in range(1, 11):
print(f'第{page}页')
URL = f'https://www.chinanews.com.cn/scroll-news/news{page}.html'
# URL = 'https://101.qq.com/#/hero'
# headers = {} --> headers是一个字典:{key:value}
# headers是给爬虫提供伪装的
# User-Agent --> 将爬虫伪装成浏览器
Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44'
}
response = requests.get(url=URL, headers=Headers)
# 如果状态码=200,爬虫可用
if response.status_code == 200:
response.encoding = 'utf-8'
# response.encoding = 'gbk'
# 打印网页源代码(字符串)
print(response.text)
# 为什么要对比打印结果和网页中的内容是否一致?
"""
网页:分为静态页面和动态页面
"""
soup = BeautifulSoup(response.text, 'html.parser')
print(soup, type(soup)) # <class 'bs4.BeautifulSoup'>
select
: 根据CSS选择器(标签、class、id等)定位数据,得到的是符合这个选择器的所有结果(整体是列表,列表中每个元素是一个==bs4
类型==的数据<class 'bs4.BeautifulSoup'>
)
select_one
: 根据CSS选择器(标签、class、id等)定位数据,得到的是符合这个选择器的一个结果
text
: 从bs4
类型数据中提取标签内的内容,结果为str
attrs
: 从bs4
类型数据中提取标签内容属性值,结果为str
# 接上面的if缩进
li_list = soup.select('body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
# print(li_list)
for i in li_list:
# print(i)
if i.select_one('li > div.dd_lm > a') != None:
news_type = i.select_one('li > div.dd_lm > a').text # 调用标签中的内容.text,调用出来是str类型
# i.select_one('li > div.dd_lm > a') 有内容的提取出来是bs4类型, None为None类型
# print(news_type)
news_title = i.select_one('li > div.dd_bt > a').text
# print(news_title)
news_href = 'http://www.chinanews.com.cn' + i.select_one('li > div.dd_bt > a').attrs['href']
# print(news_href)
new_time = i.select_one('li > div.dd_time').text
# print(new_time)
print(news_type, news_title, news_href, new_time