用 Python 写爬虫
549
2022-02-02
版本说明
Python 3.10.2
使用到的功能索引
- 网络请求 requests
- 网页数据解析 BeautifulSoup,对网页列表进行分析,抓取详情页信息
- 数据保存到SQLite sqlite3
- 保存图片到本地
记录抓取过程
这回以抓取《B站的动森Wiki》中的动物数据为例,抓取过程大致为:访问分析列表 -> 摘取详情链接 -> 访问分析详情 -> 抓取数据 -> 抓取保存图片信息 -> 保存数据到 SQLite
访问分析列表
def get_list(conn):
url = 'https://wiki.biligame.com/dongsen/%E5%B0%8F%E5%8A%A8%E7%89%A9%E5%9B%BE%E9%89%B4'
strhtml = requests.get(url)
soup = BeautifulSoup(strhtml.text, 'html.parser')
data = soup.find_all(name='tr', attrs={'data-param2': True})
i = 0
for tr in data:
i = i + 1
a = tr.find(name='a', attrs={'href': True})
get_one(conn, f'https://wiki.biligame.com{a.get("href")}')
目前了解到的 BeautifulSoup 中对页面信息有两种分析查找方法html.parser
和lxml
。
- html.parser:这里用来按照节点名称和节点属性查找 HTML 的 DOM 节点。
- lxml:用来按照 xpath 查找 DOM 节点。
访问分析详情
代码节选
def get_one(conn, url):
if url[-6:] == 'String' or url[-3:] == 'png':
return
strhtml = requests.get(url)
soup = BeautifulSoup(strhtml.text, 'lxml')
json = {}
data = soup.select('#mw-content-text > div > div.box-poke-big > div.box-poke-left > div:nth-child(2) > font.box-font')
json['生日'] = data[0].text
data = soup.select('#mw-content-text > div > div.box-poke-big > div.box-poke-right > div > div > a > img')
json['照片'] = data[0].get('src')
json['照片'] = download_img(json['照片'], '/Downloads/pic/photo', json['姓名'])
抓取保存图片信息
def download_img(img_url, path, name):
r = requests.get(img_url)
file = f'{name}{img_url[img_url.rfind("."):]}'
if r.status_code == 200:
# 将内容写入图片
open(f'{path}\\{file}', 'wb').write(r.content)
del r
return file
保存数据到 SQLite
对数据的存储需要分几步完成
- 打开数据库连接
- 数据处理和保存
- 提交
- 关闭数据库连接
最外层打开/关闭数据库连接
if __name__ == '__main__':
conn = sqlite3.connect('dongsen.sqlite')
print("数据库打开成功")
... ...
conn.close()
print("数据库已关闭")
数据处理和保存/提交
conn.execute(f'insert into animal (birthday, photo, ...) '
f'values '
f'(\'{json["生日"]}\',\'{json["照片"]}\', ...)')
conn.commit()
参考
SQLite - Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
beautifulsoup4 bs4 find_all & find 函数解析
python爬虫:BeautifulSoup 使用select方法详解
Python 正则表达式
python-正则表达式RE
python 爬虫爬取内容时, \xa0 、 \u3000 的含义与处理方法
- 0
- 0
-
分享