Python抓取博客記錄,獲取標(biāo)題與url
網(wǎng)友投稿 881 2022-05-30
在博客網(wǎng)站發(fā)布了一些博客。總共有四十多篇。現(xiàn)在查看這些博客需要翻頁,不是很方便。
想要弄出一個(gè)列表,把標(biāo)題和鏈接展示出來。如果手動(dòng)去復(fù)制粘貼,耗時(shí)耗力,也不夠自動(dòng)化。
有沒有什么自動(dòng)化的方法呢?想到以前用python做過抓取的功能。
開發(fā)環(huán)境:
Python3.7
PyCharm 2018.3.7 (Community Edition)
macOS 11.4
安裝scrapy
我們主要使用的框架是scrapy,官網(wǎng) https://scrapy.org/
如果需要換用清華的pip源,執(zhí)行下面的命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
根據(jù)官網(wǎng)文檔進(jìn)行安裝
pip3 install Scrapy
分析目標(biāo)網(wǎng)頁
目標(biāo)網(wǎng)頁的部分html如下
需要提取的是標(biāo)題(title)和網(wǎng)址(url)。
shell工具
使用scrapy shell工具來分析一下目標(biāo)網(wǎng)頁
scrapy shell 'https://bbs.huaweicloud.com/community/usersnew/id_1606985929124732/page_1'
windows下的url需要用雙引號
可以看到如下的運(yùn)行結(jié)果
2021-10-13 09:46:47 [asyncio] DEBUG: Using selector: KqueueSelector [s] Available Scrapy objects: [s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc) [s] crawler
嘗試用scrapy的css()方法來提取元素,操作它的response變量
例如提取div.blog-menu
In [2]: response.css('div.blog-menu') Out[2]: [
可以得到頁面上所有滿足要求的元素。拿到的元素是Selector,可以再進(jìn)行下一步的操作。
用for循環(huán)讀取提取到的元素,在此基礎(chǔ)上,去抓取中文標(biāo)題
In [6]: for item in response.css('div.blog-menu'): ...: print(item.css('a.common-blog-title::attr(title)').extract()[0]) ...: Kotlin協(xié)程取消與超時(shí) Android Kotlin協(xié)程入門 Kotlin協(xié)程基礎(chǔ) Kotlin協(xié)程入門 Android View post 方法 Android Activity 傳遞Parcelable對象 Android Handler,Looper與MessageQueue使用與分析 Android線程池使用介紹 Java線程介紹 使用ECharts繪制網(wǎng)址徑向樹狀圖
a.common-blog-title::attr(title)表示的是我們要查找里面的內(nèi)容,指定class為common-blog-title,并且查找title屬性。
css().extract()將結(jié)果列表提取出來。最后得到我們關(guān)心的信息。
獲取url同理,把提取部分修改為::attr(href)
代碼
前面用shell工具進(jìn)行分析,我們了解提取目標(biāo)信息的方法。接下來寫Python代碼。
在合適的地方新建一個(gè)scrapy工程
scrapy startproject blog
可以得到一系列文件
blog spiders .gitignore __init__.py __init__.py items.py middlewares.py pipelines.py settings.py
在spiders目錄里新建一個(gè)文件Hw.py,它就是我們的“蜘蛛”。完整代碼如下。
import json import scrapy def cmp(item): return item['page'] class HwBlog(scrapy.Spider): """ 在最外層的blog目錄進(jìn)行操作 scrapy crawl hw """ name = "hw" # scrapy crawl hw res_list = [] req_count = 0 total_url = 5 def start_requests(self): self.res_list = [] urls = [] base_url = 'https://bbs.huaweicloud.com/community/usersnew/id_1606985929124732/page_' for i in range(1, self.total_url + 1): urls.append(base_url + str(i)) for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): self.req_count = self.req_count + 1 page = response.url.split("_")[-1] for item in response.css('div.blog-menu'): title_se = item.css("a.common-blog-title") blog_url = 'https://bbs.huaweicloud.com' + (title_se.css("::attr(href)").extract()[0]) blog_title = title_se.css("::attr(title)").extract()[0] self.res_list.append({"title": blog_title, "url": blog_url, "page": page}) json_res = json.dumps(self.res_list, ensure_ascii=False) print(json_res) res_file_path = 'raw/hw.json' with open(res_file_path, 'w+') as f: f.write(json_res) if self.req_count < self.total_url: return res_md = 'raw/hw.md' self.res_list.sort(key=cmp) # 用頁碼來排序 with open(res_md, 'w+') as f: f.writelines('## 華為云社區(qū)') f.write('\n博客數(shù)量:' + str(len(self.res_list)) + '\n') for d in self.res_list: f.write('\n') f.write('- [' + d['title'] + '](' + d['url'] + ')')
要啟動(dòng)的話,輸入以下命令
scrapy crawl hw
接下來簡單看一下代碼
變量
name是蜘蛛的名字。我們啟動(dòng)的時(shí)候會(huì)用到它。這個(gè)名字由我們自己定義。
res_list是暫存結(jié)果的列表。把獲取到的結(jié)果暫時(shí)存放在里面。
total_url表示一共要爬幾個(gè)頁面
req_count表示請求次數(shù)
start_requests(self)
在這個(gè)方法里進(jìn)行一些配置工作。比如配置目標(biāo)url。
我們是預(yù)先知道有5個(gè)頁面,所以配置了5個(gè)url。
用scrapy.Request(url=url, callback=self.parse)構(gòu)建請求
parse是回調(diào)函數(shù),請求成功后走這個(gè)方法。
parse(self, response)
請求成功后,結(jié)果保存在response中。前面用shell進(jìn)行的操作,可以直接寫成python代碼。
當(dāng)請求次數(shù)達(dá)到目標(biāo)后,開始寫文件。
小結(jié)
這是Python scrapy的一次簡單應(yīng)用。
安裝scrapy,分析目標(biāo)網(wǎng)頁。把獲取到的數(shù)據(jù)整理后寫成markdown文件。
Python Scrapy
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
Python3 網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)] 1.4.3-Redis 的安裝">[Python3 網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)] 1.4.3-Redis 的安裝
推薦文章
企業(yè)生產(chǎn)管理是什么,企業(yè)生產(chǎn)管理軟件
進(jìn)盤點(diǎn)進(jìn)銷存軟件排行榜前十名
進(jìn)銷存系統(tǒng)哪個(gè)簡單好用?進(jìn)銷存系統(tǒng)優(yōu)點(diǎn)
工廠生產(chǎn)管理(工廠生產(chǎn)管理流程及制度)
生產(chǎn)管理軟件,機(jī)械制造業(yè)生產(chǎn)管理,制造業(yè)生產(chǎn)過程管理軟件
進(jìn)銷存軟件和ERP有什么區(qū)別?進(jìn)銷存與erp軟件理解
進(jìn)銷存如何進(jìn)行庫存管理
如何利用excel制作銷售訂單管理系統(tǒng)?
數(shù)據(jù)庫訂單管理系統(tǒng)有哪些功能?數(shù)據(jù)庫訂單管理系統(tǒng)怎么設(shè)計(jì)?
什么是數(shù)據(jù)庫管理系統(tǒng)?
最近發(fā)表
- 寵物集市-寵物集市華東、華南、華北排行榜一覽表
- 京寵展-2025年時(shí)間表
- 寵物集市在深圳哪里有?時(shí)間地址最新消息
- 亞洲寵物展2025年展會(huì)介紹
- 京寵展信息指南
- 寵物展會(huì)2025年時(shí)間表
- 亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
- 2025年亞洲寵物展覽會(huì)、京寵展有哪些亮點(diǎn)
- wps演示添加自定義按鈕設(shè)置動(dòng)作改變按順序播放" href="http://m.bai1xia.com/news/post/118206.html">wps演示添加自定義按鈕設(shè)置動(dòng)作改變按順序播放
- WPS行中的文本調(diào)整到行中" href="http://m.bai1xia.com/news/post/119027.html">如何將WPS行中的文本調(diào)整到行中
熱評文章
零代碼開發(fā)是什么?2022低代碼平臺排行榜">零代碼開發(fā)是什么?2022低代碼平臺排行榜
進(jìn)銷存庫存管理系統(tǒng)(智慧進(jìn)銷存)">智能進(jìn)銷存庫存管理系統(tǒng)(智慧進(jìn)銷存)
在線文檔哪家強(qiáng)?8款在線文檔編輯軟件推薦">在線文檔哪家強(qiáng)?8款在線文檔編輯軟件推薦
WPS2016怎么繪制簡單的價(jià)格表?
系統(tǒng)的功能有哪些?餐飲服務(wù)系統(tǒng)的構(gòu)成及工作程序">連鎖餐飲管理系統(tǒng)的功能有哪些?餐飲服務(wù)系統(tǒng)的構(gòu)成及工
進(jìn)銷存庫存管理盤點(diǎn)">簡單進(jìn)銷存庫存管理盤點(diǎn)