使用环境:
- Windows10。
- Python版本Python3.9.5 下载地址 https://www.python.org/downloads/release/python-395/
- IDE我使用的是PyCharm,是专门为Python开发的IDE。这是JetBrians的产品
1.获取到HTML内容
requests库
安装命令:(直接黑窗口,或者PyCharm工具的 Terminal 窗口执行命令即可)
pip install requests
python代码:
import requests #引入requests库
r = requests.get('https://www.bilibili.com/video/BV1G4411L7Ek?p=7') #像目标url地址发送get请求,返回一个response对象
print(r.text) #r.text是http response的网页HTML
使用request库,向网站发送http请求,获取到HTML内容
2.从HTML获取目标数据
lxml
安装lxml,这是一个解析器,BeautifulSoup可以使用它来解析HTML,然后提取内容
安装命令(安装lxml的时候,总是安装失败,这个时候,我们可以换一个库进行安装,这里使用的是豆瓣 ):
pip install -i https://pypi.douban.com/simple lxml
BeautifulSoup
BeautifulSoup 有多个版本,我们使用BeautifulSoup4
BeautifulSoup4.4.0中文官方文档 BeautifulSoup4.2.0中文官方文档
不同版本的用法差不多,几个常用的语法都一样
安装命令:(直接黑窗口,或者PyCharm工具的 Terminal 窗口执行命令即可)
pip install beautifulsoup4
使用BeautifulSoup模块来从HTML文本中提取我们想要的数据。
如果不安装lxml,则BeautifulSoup会使用Python内置的解析器对文档进行解析。之所以使用lxml,是因为它速度快。
文档解析器对照表如下:
解析器 | 使用方法 | 优势 | 劣势 |
Python标准库 | BeautifulSoup(markup,"html.parser") | 1. Python的内置标准库 2. 执行速度适 3. 中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup,"lxml") | 1. 速度快 2. 文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup,["lxml-xml"]) BeautifulSoup(markup,"xml") | 1. 速度快 2. 唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup,"html5lib") | 1. 最好的容错性 2. 以浏览器的方式解析文档 3. 生成HTML5格式的文档 | 速度慢,不依赖外部扩展 |
pymysql
是用来连接python和mysql之间的通道,在使用python编程时,通过它来和mysql数据库进行交互
安装命令:
pip install pymysql
直接对HTML进行解析,随后对类似分页的数据不断分页获取,进行解析获得相应图片地址及描述,代码如下:
import requests
from bs4 import BeautifulSoup
import pymysql
import uuid
#模拟浏览器访问头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
for page in [1,2,3,4,5,6,7,8,9,10]:
html_doc = requests.post('https://某某网站.com/pic_space5?page='+str(page), headers=headers) #像目标url地址发送get请求,返回一个response对象
#print(html_doc.text) #html_doc.text是http response的网页HTML
soup = BeautifulSoup(html_doc.text, 'lxml') #声明BeautifulSoup对象
#使用find方法查到img标签
for k in soup.find_all(name="img" ):
if k['src'] != '':
if str(k['src']).startswith("https:"):
print(k['alt'])
print(k['src'])
conn = pymysql.connect(host='localhost', user='root', password='123456', database='decorate') # 创建数据库连接
cursor = conn.cursor() # 创建游标
sql = "insert into img_info(img_id,img_desc,img_name,img_src,img_type,img_source) values ('" + str(uuid.uuid1())+"','"+k['alt']+"','"+k['alt']+"','"+k['src']+"','0003','土巴兔')" # 要执行的sql语句
print(sql)
resu = cursor.execute(sql) # 提交sql语句
conn.commit() # 提交缓存
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
if resu ==1:
print("导入数据库成功!")
以上还需进行优化,因为也是初次接触,所以没有过多处理,有更好方法解析还请指教!