爬虫入门 01 request库与bs4库初步使用
爬虫概述
爬虫:
1.百度百科
2.自己理解:
通过代码、模拟浏览器上网 然后抓取数据的过程 数据解析
2.爬虫是否合法?
1.法律允许
2.有法律风险的
3.统一规定? 【法律界限】
robots.txt协议
4.爬虫的分类:
1.获取一整张页面 【通用爬虫】
2.获取一整张页面 部分数据 【聚焦爬虫】
3.检查页面更新、获取页面最新的更新的数据 【增量式爬虫】
5.爬虫的规则:
1.反爬策略:
门户网站 通过 技术手段 防止爬虫程序对页面爬取数据
2.反 反爬策略
爬虫程序 通过 技术手段 对页面爬取数据
http 与 https
service 与 client 进行数据交互的一种形式
request:
User-Agent: 请求载体的身份标识
response:
Content-Type:服务器响应client的数据类型
6.爬虫技术
1.urllib 【老】
2.requests 【好用】
requests:
1.是什么
python自带的 基于网络请求的模块 功能强大 简单高效
2.干什么
模拟浏览器发送请求
3.怎么用:
1.指定url
2.发送请求【get、post】
3.获取相应的数据
4.存储数据
pip install requests
如何获取一整张页面的部分内容?
1.整个html + html数据解析【数据解析没讲】
2.获取部分html
爬取图片:
数据解析:
1.为什么要进行数据解析?
1.为了获取指定的页面数据
html
2.数据解析分类:
1.正则 【了解】
2.bs4
3.xpath 【重要】 scrapy
3.解析的数据有哪些?
1.数据源:
html
2.文本 或者 图片 =》 html标签里面 或者 标签的属性
4.如何解析?
1.标签定位
2.解析数据
5.聚焦爬虫?
1.指定url
2.发起请求
3.获取相应数据
4.数据解析
5.存储数据
bs4:
数据解析的工具
原理:
1.标签定位
2.解析数据
怎么用:
1.实例化bs4类 BeautifulSoup => 加载 html
2.调用api 标签定位+ 解析数据
pip install bs4 -i https://pypi.douban.com/simple
使用:
bs4 api
爬虫案例
1.单独爬取整张页面并保存到本地(基础中的基础)
import requests
if __name__ == '__main__':
# 1.url
url = "https://www.baidu.com/"
# 2.发送请求
resp = requests.get(url = url)
# 3.获取页面数据
resp.encoding="utf-8"
page_info = resp.text
print(page_info)
# 4.存储数据
with open(r"D:\ \python-sk\data\baidu.html","w",encoding="utf-8") as fp:
fp.write(page_info)
2.学会伪装自己,夹带参数了(基础中的基础)
import requests
'''
User-Agent 检查:
门户网站检查 身份 【反爬机制】
ua伪装
'''
if __name__ == '__main__':
# 1.url
url = "https://www.sogou.com/web"
name = input("输入一个搜索词:")
params = {
"query":name
}
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent":"你的ua"
}
# 2.发送请求
resp = requests.get(url=url,params=params,headers=headers)
# 3.获取页面数据
resp.encoding="utf-8"
page_info = resp.text
print(page_info)
# 4.存储数据
with open(f"D:\ \python-sk\data\{name}.html","w",encoding="utf-8") as fp:
fp.write(page_info)
3.爬取豆瓣排行榜(基础中的基础)
import json
import requests
if __name__ == '__main__':
# 1.url
url = "https://movie.douban.com/j/chart/top_list"
# name = input("输入一个搜索词:")
params = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent":"你的ua"
}
# 2.发送请求
resp = requests.get(url=url,params=params,headers=headers)
# 3.获取页面数据
resp.encoding="utf-8"
data_json = resp.json()
print(data_json)
# 4.存储数据
fp = open("D:\ \python-sk\data\douban.json","w",encoding="utf-8")
# 这个参数是为了不使用ask码转译,直接输出中文
json.dump(data_json,fp,ensure_ascii=False)
4.与插值字符串结合,查肯德基门店
import requests
if __name__ == '__main__':
# 1.url
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"
name = input("输入一个想要搜索店铺的城市:")
params = {
'cname': name,
'pid': '',
'pageIndex': '1',
'pageSize': '10'
}
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent":"你的ua"
}
# 2.发送请求
resp = requests.get(url=url,params=params,headers=headers)
# 3.获取页面数据
resp.encoding="utf-8"
# KFC做的比较好,可以支持json和text两种格式,直接用text就可以了
# Accept: application/json, text/javascript, */*; q=0.01
data_text = resp.text
print(data_text)
# 4.存储数据
with open(f"D:\ \python-sk\data\kfc{name}.json", "w", encoding="utf-8") as fp:
fp.write(data_text)
5.进行翻译,但是该网站有token
import json
import requests
if __name__ == '__main__':
# 1.url
url = "https://fanyi.baidu.com/sug"
kw = input("输入一个搜索词:")
params = {
'kw': kw,
}
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent":"你的ua"
}
# 2.发送请求
resp = requests.post(url=url, data=params, headers=headers)
# 3.获取页面数据
resp.encoding="utf-8"
data_json = resp.json()
print(data_json)
# 4.存储数据
fp = open(f"D:\ \python-sk\data\{kw}.json","w",encoding="utf-8")
# 这个参数是为了不使用ask码转译,直接输出中文
json.dump(data_json,fp,ensure_ascii=False)
# bc8a22af34b13539bfb54c9f6176964d
# bc8a22af34b13539bfb54c9f6176964d
6.爬取图片,结合了for循环
import json
import requests
if __name__ == '__main__':
for num in range(10000,20000,1000):
# 1.url
url = f"https://game.gtimg.cn/images/lol/act/img/skin/big{num}.jpg"
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent": "你的ua"
}
# 2.发送请求
resp = requests.get(url=url, headers=headers)
# 3.获取页面数据
resp.encoding = "utf-8"
'''
text
json
content(bytes)
'''
jpg = resp.content
# 4.存储数据
# 'b' binary mode
with open(rf"D:\ \python-sk\data\{num}.jpg", "w+b") as fp:
fp.write(jpg)
7.bs4库强势加盟
实例化bs4类 BeautifulShop
调用api 标签定位 + 解析数据
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent": "你的ua"
}
fp = open(r"D:\ \python-sk\data\meizi.html","r",encoding="utf-8")
soup = BeautifulSoup(fp,"lxml")
# print(soup)
# 1.通过标签 解析文本
'''
soup.tagname
div : 返回html中第一次出现的标签 内容
a : 返回html中第一次出现的标签 内容
'''
print(soup.div)
print(soup.a)
# 2.find
'''
find
1.find('div') : 返回html中第一次出现的标签 内容
2.标签属性定位:find('div',class_='vrwrap')
vrcid="citeurl.6a48cb0"
'''
print(soup.find('div',class_='vrwrap'))
# 3.find_all
'''
find_all
取出所有符合条件的内容
'''
print(soup.find_all('span'))
# 4.select
'''
soup.select
1.标签属性值定位,取得所有符合条件范围内的值
2.可以做层级
html:传值class="vrwrap"要写成 .vrwrap
'''
print(soup.select(".vrwrap"))
print(soup.select(".clamp01 > span ")[0])
# 5.取文本数据
print(soup.select(".clamp01 > span ")[0].text)
# 6.取属性数据(举例子)
print(soup.select(".clamp01 > span ")[0]["class"])
print(soup.find('div',class_='clamp01'))
# 7.和循环结合,取出文本和里面的属性
for el in soup.select(".clamp01 > span "):
print(el.text)
print(el["class"])
使用bs4库爬取小说
'''
利用bs4解析一个在线的网站(bs4最后一个案例)
https://www.shicimingju.com/book/sanguoyanyi.html
需求:
爬取小说
1.章节标题
2.章节内容
'''
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
# ua伪装 => 模拟浏览器上网
headers = {
"User-Agent":"你的ua"
}
# 1.通用爬虫
# 1.url
url = "https://www.shicimingju.com/book/sanguoyanyi.html"
page_info = requests.get(url=url,headers=headers)
page_info.encoding="utf-8"
# 页面数据
# print(page_info.text)
# 2.数据解析
soup = BeautifulSoup(page_info.text, "lxml")
# 3.标签定位
a_list = soup.select(".book-mulu > ul > li > a")
# print(a_list)
# 4.解析数据
title = []
href = []
# 可选删除之前文本数据
fp = open(r"D:\ \python-sk\data\book\mingzhu.txt","w",encoding="utf-8")
for el in a_list:
# title.append(el.text)
# href.append(el['href'])
title = el.text
detail_url = "https://www.shicimingju.com/"+el['href']
# 5.通用爬虫 => 章节内容
# 1.通用爬虫
detail_page_info = requests.get(url=detail_url,headers=headers)
detail_page_info.encoding = "utf-8"
# 2.数据解析
detail_soup = BeautifulSoup(detail_page_info.text, "lxml")
# 3.标签定位
detail_div_tag = detail_soup.find("div",class_="chapter_content")
content = detail_div_tag.text
# print(content)
# 可能会超时
# with open(f"D:\ \python-sk\data\mingzhu\{title}.txt","w",encoding="utf-8") as fp:
# fp.write(f"{title} \n {detail_url} => \n {content} \n")
fp.write(f"{title}\n{detail_url} => \n {content} \n")
print(f"{title}\n{detail_url} => 爬取ok")
fp.close()
# print(title)
# print(href)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~