Python构建Web爬虫
创始人
2024-03-12 04:02:27
0

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

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

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

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

from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium import webdriver
import timeoptions = Options()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
options.add_argument("--headless")
options.add_argument("--no-sandbox")
service = Service(executable_path="c:/software/geckodriver.exe")
browser = webdriver.Firefox(service=service, options=options)
browser.get("https://blog.csdn.net/gzroy?type=blog")

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

articles = []
articles_num = 0
while True:elements = browser.find_elements(By.TAG_NAME, 'a')for item in elements:href = item.get_attribute("href")if type(href) is str:if href.startswith("https://blog.csdn.net/gzroy/article/details") and href not in articles:articles.append(href)if len(articles)<=articles_num:breakif articles_num==0:browser.execute_script('window.scrollTo(0,document.body.scrollHeight/2)')time.sleep(0.5)articles_num = len(articles)browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')time.sleep(2)

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

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

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

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

conn = sqlite3.connect('blog.db')
c = conn.cursor()
c.execute('''CREATE TABLE ARTICLE(ID INT PRIMARY KEY     NOT NULL,TITLE          TEXT    NOT NULL,CREATETIME     TEXT     NOT NULL,CONTENT        TEXT);''')
conn.commit()

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

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

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

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

相关内容

热门资讯

求一本快递员猎艳记,主角叫方志... 求一本快递员猎艳记,主角叫方志强完本的书喜欢就出钱买着看吧 这书是找不到的
我想看电视剧成吉思汗的完整版(... 我想看电视剧成吉思汗的完整版(刚播时40多集),现在被删减的都不到30集了,请大家帮帮忙,谢谢了蒙语...
国科优选荣膺乡村振兴标杆案例,... 转自:衡水日报4月11日,在权威平台“2025中国消费经济论坛”揭晓的“助力乡村振兴典型案例”评选中...
午报三大指数均小幅下挫,脑机接... 转自:财联社一、【早盘盘面回顾】财联社6月17日讯,市场早盘窄幅震荡,三大指数小幅下跌。沪深两市半日...
济南市第七人民医院完成高难度游...   近日,济南市第七人民医院骨外一科成功为47岁的王先生完成高难度游离腓肠内侧动脉皮瓣移植术,让其右...
川农被称之为“网红学校”,是有... 川农被称之为“网红学校”,是有什么特别的吗?因为表情包标语 网红了
消息称三星改进版 HBM3E ...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! IT之家 6 月 1...
梓字的寓意是什么 梓字的寓意是什么指落叶乔木;治木器;用木头雕刻成印刷用的版;指故里;姓;名。出自《诗·墉风·定之方中...
45年前的今天,彭加木在罗布泊... 1980年6月17日,中国著名科学家彭加木在新疆罗布泊进行科学考察时神秘失踪,留下了一张简短的字条:...
港股午评|恒生指数早盘跌0.1... 港股恒生指数跌0.13%,跌32点;恒生科技指数跌0.06。港股早盘成交1081亿港元。《稳定币条例...
特朗普一句话,市场恐慌再现 来源:华尔街情报圈轮到中国开市交易,市场情绪又变了:- 油价重新上涨,尽管涨幅不大,但代表市场对潜在...
张尧浠:地缘缓解利率预期不变 ... 6月17日:上交易日周一(6月16日):国际黄金高开后遇阻回落收跌,收复上周五涨幅,形成阴包阳的反弹...
音乐节遇上父亲节 同仁堂奏响“... 6月15日,北京交通大学“交响青春”音乐节火热拉开帷幕。百年中医药老字号——北京同仁堂生脉饮作为本次...
求玄幻小说 紫川 完整版的. 求玄幻小说 紫川 完整版的.老猪写的那个么?
解读创业板指剔除国证ESG评级... 每经记者|黄宗彦    每经编辑|马子卿     6月16日,深圳证券交易所(以下...
马上要考试了,没时间了,但感觉... 马上要考试了,没时间了,但感觉什么都还不会怎么办?我也一样,网课根本学不进去,我现在正在需要四天学完...
柠檬冰糖的做法腌制 柠檬冰糖的做法腌制片准备一个可以密封的瓶子,一层柠檬,一层冰糖,一层柠檬,一层冰糖,这样出来的柠檬非...
请问哈师大教育学研究生都有什么... 请问哈师大教育学研究生都有什么专业啊?急方向有七个:课程与教学论、教育学原理、教育史、学前教育、比较...
小学生理想怎么写? 小学生理想怎么写? 先写理想具体是什么,再用几个具体实例来说明为什么会有这个理想,该怎样朝这个理想奋...
神仙道有哪些奇术列表 奇术可以... 神仙道有哪些奇术列表 奇术可以分为哪几种生命值、攻击力、防御力、绝技攻击、绝技防御、法术攻击、法术防...