python爬取B站文章信息并存入数据库

9 篇文章 1 订阅
6 篇文章 1 订阅

效果展示

前言

学了点selenium和python操作数据库

看B站文章的时候想到能不能把这些爬下来存入数据库(作者名字,标题,链接)内容就不爬了

虽然爬下来的数据没什么用,但也是一个小练习,促进自己成长

目标网页

https://www.bilibili.com/read/home?spm_id_from=333.851.b_7072696d617279467269656e64736869704c696e6b.1

需要用到的库

from selenium import webdriver
from time import sleep
from lxml import etree
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions
import pymysql

使用selenium是,总会弹出一个网页,很麻烦,使用无可视化去除浏览器窗口,规避检测

#无可视化
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

#规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])

#规避检测
wd = webdriver.Chrome(executable_path='D:/Apycharm/pachong/chromedriver/chromedriver.exe',chrome_options=chrome_options,options=option)

打开b站专栏

#打开b站
wd.get('https://www.bilibili.com/read/home?spm_id_from=333.851.b_7072696d617279467269656e64736869704c696e6b.1')

获取源码数据并解析数据

# 获取源码数据
page_text = wd.page_source
# 解析数据
tree = etree.HTML(page_text)

现在,我们开始分析网页

按F12查看网页源代码

通过分析得出代码

先提取包含 作者名字,标题,链接 信息的 div,再对提取出来的列表进行遍历,是因为有许许多多的一种类型的div,依次取出 作者名字,链接

注意: 标题提取的时候会出现空列表,增加一个异常处理,如果列表为空,不进行提取

trrr = tree.xpath('//div[@class="article-content"]')

    for li in trrr:

        #作者名字
        names = li.xpath('.//span[@class="nick-name"]/text()')[0]

        links = li.xpath('./div[@class="article-left-block"]/a/@href')[0]

        #链接
        link ='https:' + links

        #可能出现空列表错误   list index out of range
        try:

            #标题
            titles = li.xpath('.//span[@class="article-title"]/@title')[0]

至此,信息已经提取完毕

下一步,进行数据库的操作

我的数据库用户root,密码000000,指定数据库bilibili,指定表名Bli 

表结构如下图

上代码

        try:

            #标题
            titles = li.xpath('.//span[@class="article-title"]/@title')[0]

            conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='20191007lh', database='bilibili',charset='utf8')
            # 生成游标对象
            cur = conn.cursor()
            sql1 = "INSERT INTO Bli VALUES (%s,%s,%s)"
            data = [names,titles,link]
            try:
                cur.execute(sql1, data)  # 执行插入的sql语句
                conn.commit()  # 提交到数据库执行
            except Exception:
                # 发生错误时回滚
                conn.rollback()
                print("出现错误/可能与重复的值有关")
            conn.close()  # 关闭数据库连接
        except Exception:
            pass

最后,下拉页面显示提示信息,休眠1秒 使用for循环将整个代码循环运行,

    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    print("以将第%s页存入数据库中" % i)

    sleep(1)

    i += 1

wd.quit()


完整代码

from selenium import webdriver
from time import sleep
from lxml import etree
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions
import pymysql

#无可视化
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

#规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])

#规避检测
wd = webdriver.Chrome(executable_path='D:/Apycharm/pachong/chromedriver/chromedriver.exe',chrome_options=chrome_options,options=option)

#打开b站
wd.get('https://www.bilibili.com/read/home?spm_id_from=333.851.b_7072696d617279467269656e64736869704c696e6b.1')

# 循环 下拉

for i in range(1, 100):
    # 获取源码数据
    page_text = wd.page_source
    # 解析数据
    tree = etree.HTML(page_text)

    trrr = tree.xpath('//div[@class="article-content"]')

    for li in trrr:

        #作者名字
        names = li.xpath('.//span[@class="nick-name"]/text()')[0]

        links = li.xpath('./div[@class="article-left-block"]/a/@href')[0]

        #链接
        link ='https:' + links

        #可能出现空列表错误   list index out of range
        try:

            #标题
            titles = li.xpath('.//span[@class="article-title"]/@title')[0]

            conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='000000', database='bilibili',charset='utf8')
            # 生成游标对象
            cur = conn.cursor()
            sql1 = "INSERT INTO Bli VALUES (%s,%s,%s)"
            data = [names,titles,link]
            try:
                cur.execute(sql1, data)  # 执行插入的sql语句
                conn.commit()  # 提交到数据库执行
            except Exception:
                # 发生错误时回滚
                conn.rollback()
                print("出现错误/可能与重复的值有关")
            conn.close()  # 关闭数据库连接
        except Exception:
            pass

    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    print("以将第%s页存入数据库中" % i)

    sleep(1)

    i += 1

wd.quit()

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航冲冲冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值