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)行安裝

      Python抓取博客記錄,獲取標(biāo)題與url

      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 [s] item {} [s] request [s] response <200 https://bbs.huaweicloud.com/community/usersnew/id_1606985929124732/page_1> [s] settings [s] spider [s] Useful shortcuts: [s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed) [s] fetch(req) Fetch a scrapy.Request and update local objects [s] shelp() Shell help (print this help) [s] view(response) View response in a browser 2021-10-13 09:46:48 [asyncio] DEBUG: Using selector: KqueueSelector

      嘗試用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)容。

      上一篇:NLP之Bert相關(guān)算法介紹
      下一篇:【愚公系列】2021年12月 網(wǎng)絡(luò)工程-PKI
      相關(guān)文章
      国产精品亚洲四区在线观看| 亚洲国产成人精品青青草原| 亚洲已满18点击进入在线观看| 婷婷精品国产亚洲AV麻豆不片| 亚洲精品午夜国产VA久久成人| 亚洲一区日韩高清中文字幕亚洲| 国产亚洲视频在线播放大全| 精品无码专区亚洲| 亚洲爆乳无码专区www| 亚洲欧美一区二区三区日产| 亚洲日韩一中文字暮| 亚洲熟妇AV一区二区三区宅男| 久久亚洲精品国产精品婷婷| 亚洲人成小说网站色| 精品久久久久久亚洲精品| 精品亚洲国产成人| 亚洲影院天堂中文av色| 亚洲色精品三区二区一区| 亚洲欧美日韩一区二区三区 | 亚洲精品无码成人片在线观看| 国产成人+综合亚洲+天堂| 全亚洲最新黄色特级网站 | 亚洲av无码无在线观看红杏| 国产亚洲综合一区柠檬导航| 亚洲成AV人片在线观看无码| 亚洲AV日韩精品久久久久久久| 亚洲精品无码不卡| 亚洲一区二区三区播放在线| 亚洲天堂2016| 亚洲精品国产第一综合99久久| 色婷婷六月亚洲综合香蕉| 九九精品国产亚洲AV日韩| 亚洲精品一级无码中文字幕| 在线亚洲97se亚洲综合在线| 国产亚洲一区二区精品| 亚洲国产成人久久精品影视| 亚洲国产韩国一区二区| 亚洲一卡2卡三卡4卡无卡下载| 国产亚洲精品美女久久久久久下载| 亚洲av中文无码| 亚洲午夜久久久久妓女影院|