爬虫
爬虫
程序员应根据程序员的想法编写程序批爬行数据(图片)。音频、视频、数据等)
- 解析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
- 根据响应结果解析页面,提取数据
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