用 Python 写爬虫

Posted by aclyyx on 02-02,2022

版本说明

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.parserlxml

  • 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 的含义与处理方法