• Python构建Web爬虫


    最近想建设一个自己的个人网站,把现在CSDN上面的我的博客内容搬运过去,因此想用Python来做一个web爬虫,自动把我在CSDN上的博客文章下载下来并做一些格式转换,发布到我的个人网站上。

    这个web爬虫需要用到python的requests, beautifulsoup, selenium这几个库。

    因为selenium需要基于浏览器来操作,因此我们需要安装相应的driver。Chrome, Firefox都有对应的driver。因为我是用的firefox,因此在这个网址下载Firefox的driver, Releases · mozilla/geckodriver · GitHub

    之后我们可以调用selenium来加载网站了,如以下代码:

    1. from selenium.webdriver.firefox.service import Service
    2. from selenium.webdriver.firefox.options import Options
    3. from selenium.webdriver.common.by import By
    4. from selenium import webdriver
    5. import time
    6. options = Options()
    7. options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
    8. options.add_argument("--headless")
    9. options.add_argument("--no-sandbox")
    10. service = Service(executable_path="c:/software/geckodriver.exe")
    11. browser = webdriver.Firefox(service=service, options=options)
    12. browser.get("https://blog.csdn.net/gzroy?type=blog")

    代码中的options设置了--headless的参数,表示不会打开一个浏览器的窗口,如果想观看selenium操作浏览器的状态,可以把这个参数设置取消。等待浏览器加载网页完毕之后,我们就可以读取文章的列表以及网址了:

    1. articles = []
    2. articles_num = 0
    3. while True:
    4. elements = browser.find_elements(By.TAG_NAME, 'a')
    5. for item in elements:
    6. href = item.get_attribute("href")
    7. if type(href) is str:
    8. if href.startswith("https://blog.csdn.net/gzroy/article/details") and href not in articles:
    9. articles.append(href)
    10. if len(articles)<=articles_num:
    11. break
    12. if articles_num==0:
    13. browser.execute_script('window.scrollTo(0,document.body.scrollHeight/2)')
    14. time.sleep(0.5)
    15. articles_num = len(articles)
    16. browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    17. time.sleep(2)

    因为CSDN的文章列表不会一次全部加载,当滚动页面时候才会陆续加载,因此我们需要执行Javascript的语句,模拟滚动到页面下方。另外有一个奇怪的地方,就是如果第一次滚动到页面下方,好像页面并没有自动记载隐藏的文章,因此我改动了一下,第一次先滚动到页面中间,然后再滚动到页面最下方,这样就可以了。可能是和网站的一些具体设定相关。

    获取到文章列表之后,我们就可以依次访问每篇文章,读取文章内容并保存到数据库中。

    我这里选取了sqlite3这个轻量级的数据库,用requests来获取网页内容,用beautifulsoup来解析网页,提取文章的标题,创建时间和内容。

    首先是访问数据库,创建一个数据表用于保存文章,代码如下:

    1. conn = sqlite3.connect('blog.db')
    2. c = conn.cursor()
    3. c.execute('''CREATE TABLE ARTICLE
    4. (ID INT PRIMARY KEY NOT NULL,
    5. TITLE TEXT NOT NULL,
    6. CREATETIME TEXT NOT NULL,
    7. CONTENT TEXT);''')
    8. conn.commit()

    然后是构建一个循环,每次访问文章列表的一篇文章,提取相关内容并保存到数据库:

    1. id = 0
    2. for item in articles[::-1]:
    3. article = requests.get(item, headers = {'User-Agent':'Mozilla/5.0'})
    4. soup = BeautifulSoup(article.text, 'html.parser')
    5. title = soup.find('h1', {'id': 'articleContentId'}).text
    6. title_b64 = base64.b64encode(title.encode()).decode()
    7. content = soup.find('div', {'id':'content_views'}).encode_contents()
    8. content_b64 = base64.b64encode(content).decode()
    9. createTime = soup.find('span', {'class':'time'}).text[2:-3]
    10. sqlstr = "INSERT INTO ARTICLE (ID,TITLE,CREATETIME,CONTENT) VALUES (" + \
    11. str(id) + ",'" + title_b64 + "','" + createTime + "','" + content_b64 + "')"
    12. c.execute(sqlstr)
    13. id += 1
    14. conn.commit()
    15. conn.close()

    这里我提取了文章的标题和内容正文之后,先做了一个base64的转换再保存到数据库,这里主要是考虑避免一些特殊字符对sql语句的影响。

    至此,整个爬虫已经处理完毕所有的文章了。下一步我将构建一个Blog,把我们保存的文章展示在Blob中。待续。。。

  • 相关阅读:
    Linux C | Linux标准I/O编程
    夏日炎炎玩转新加坡:盘点室内景点和夜游好去处
    智慧校园数字孪生三维可视化综合解决方案:PPT全83页,附下载
    hexo+github手把手教你部署个人博客
    Yolov8小目标检测(8):微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测
    Linux驱动开发笔记
    接口自动化测试总结
    C# 中的反射机制
    读书会 | 拨开心理咨询的迷雾:普通人应该如何看待心理咨询
    线性反向传播(机器学习)
  • 原文地址:https://blog.csdn.net/gzroy/article/details/128075985