• 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】拓展:运维面试题,进程管理常见的7大问题
    Windows使用进程监视器查看进程读写的文件名
    Java mybatis spring习题
    渗透工具-内网权限维持-Cobalt strike
    理解 ByteBuffer
    谈谈创业
    药物研发检测记录模板-0901溶液颜色检查法检验原始记录
    计算机考研数据结构题库
    SWT/ANR问题--StorageManagerService卡住
    2024年申报国自然项目基金撰写及技巧
  • 原文地址:https://blog.csdn.net/gzroy/article/details/128075985