百日筑基篇——python爬蟲學習(一)

百日筑基篇——python爬蟲學習(一)

文章目錄

  • 前言
  • 一、python爬蟲介紹
  • 二、URL管理器
  • 三、所需基礎模塊的介紹
    • 1. requests
    • 2. BeautifulSoup
      • 1. HTML介紹
      • 2. 網頁解析器
  • 四、實操
    • 1. 代碼展示
    • 2. 代碼解釋
      • 1. 將大文件劃分為小的文件(根據AA的ID數量劃分)
      • 2. 獲得結果頁面的url
      • 3. 獲取結果頁面,提取出所需信息
      • 4. 文件合并操作
  • 總結


前言

隨著學習的深入,有關從各種不同的數據庫中以及互聯網上的海量信息,如何有選擇性的爬取我們所需的數據以方便我們的數據分析工作,爬蟲的學習是必要的。


一、python爬蟲介紹

Python爬蟲是指使用Python編程語言編寫的程序,通過模擬瀏覽器行為從網頁中提取數據的過程

主要用途包括:

  1. 數據采集:通過爬蟲可以從互聯網上收集大量的數據,如新聞、論壇帖子、商品信息等。

  2. 數據分析:爬蟲可以獲取特定網站或多個網站的數據,進行統計和分析。

  3. 自動化測試:爬蟲可以模擬用戶行為,自動化地訪問網站,并檢查網站的功能、性能等。

  4. 內容聚合:通過爬蟲可以自動化地從多個網站上獲取信息,并將其聚合成為一個平臺,方便用戶瀏覽。

二、URL管理器

是指對爬取URL進行管理,防止重復和循環爬取,方便新增URL和取出URL。

class UrlManager():"""url管理器"""def __init__(self):self.new_urls = set()self.old_urls = set()def add_newurl(self,url):if url is None or len(url) == 0:returnif url in self.new_urls or url in self.old_urls:returnself.new_urls.add(url)def add_newurls(self,urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_newurl(url)def get_url(self):if self.has_newurl():url = self.new_urls.pop()self.old_urls.add(url)return urlelse:return Nonedef has_newurl(self):return len(self.new_urls) > 0

該類中創建了兩個集合:new_urls和 old_urls ,分別表示新增url和已爬取完的url的存儲集合。
定義了四個方法,

  1. add_newurl(self, url): 添加新的URL到new_urls集合中。如果URL為空或已經存在于new_urls或old_urls中,則不添加。
  2. add_newurls(self, urls): 批量添加URL到new_urls集合中。如果URL為空,則不添加。
  3. get_url(self): 從new_urls中獲取一個未爬取的URL,將其移動到old_urls集合中,并返回該URL。如果new_urls為空,則返回None。
  4. has_newurl(self): 判斷是否還有未爬取的URL。返回new_urls集合的長度是否大于0。

三、所需基礎模塊的介紹

1. requests

用于發送HTTP請求,并獲取網頁內容。

import requests
requests.post(url=,params=,data=,headers=,timeout=,verify=,allow_redirects=,cookies=)
#里面的參數依次代表請求的URL、查詢參數、請求數據、請求頭、超時時間、SSL證書驗證、重定向處理和Cookies。url = "https://wolfpsort.hgc.jp/results/pLAcbca22a5a0ccf7d913a9fc0fb140c3f4.html"r = requests.post(url)
#查看狀態碼,200為請求成功
print(r.status_code)#查看當前編碼,以及改變編碼
print(r.encoding)
r.encoding = "utf-8"
print(r.encoding)#查看返回的網頁內容
print(r.text)#查看返回的http的請求頭
print(r.headers)#查看實際返回的URL
print(r.url)#以字節的方式返回內容
print(r.content)#查看服務端寫入本地的cookies數據
print(r.cookies)

2. BeautifulSoup

用于解析HTML或XML等文檔,提取所需的數據。

1. HTML介紹

HTML指的是超文本標記語言,一種用于創建網頁結構的標記語言。它由一系列的元素(標簽)組成,通過標簽來描述網頁中的內容和結構。

HTML標簽:
是由< >包圍的關鍵詞,標簽通常成對出現,且標簽對中的第一個標簽是開始標簽,第二個則是結束標簽,如下圖所示:
請添加圖片描述

在HTML語言中,標簽中一般伴隨著屬性,比如:”id、class、herf等"

在這里插入圖片描述

2. 網頁解析器

導入 BeautifulSoup 模塊
解析的一般步驟是:

  1. 得到HTML網頁的文本
  2. 創建BeautifulSoup對象
  3. 搜索節點 (使用find_all或 find,前者返回滿足條件的所有節點,后者返回第一個)
  4. 訪問節點 (名稱、屬性、文字等)

示例代碼如下:

base_url = "https://wolfpsort.hgc.jp/"from bs4 import BeautifulSoupwith open("D:\python\PycharmProjects\pythonProject1\pachou\linshi.html", "r", encoding="utf-8") as f:html_doc = f.read()soup = BeautifulSoup(html_doc,  # HTML文檔字符串"html.parser",  # 解析器
)#可以分區
div_node = soup.find("div",id ="content")
links= div_node.find_all("a")# links = soup.find_all("a")
for link in links:print(link.name,base_url+link["href"],link.get_text())imgs = soup.find_all("img")
for img in imgs:print(base_url+img["src"])

請添加圖片描述
這是一個基于wolfpsort網頁的頁面內容的爬取,根據該網頁的HTML文本,可以通過標簽以及屬性的設置,來獲得我們所需的指定的節點,再獲取節點中的內容,如"herf"等

四、實操

1. 代碼展示

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
import os
import pandas as pddef split_gene_file(source_file, output_folder, ids_per_file):os.makedirs(output_folder, exist_ok=True)current_file = Nonecount = 0with open(source_file, "r") as f:for line in f:if line.startswith(">"):count += 1if count % ids_per_file == 1:if current_file:current_file.close()output_file = f"{output_folder}/gene_file_{count // ids_per_file + 1}.csv"current_file = open(output_file, "w", encoding='utf-8')current_file.write(line)else:current_file.write(line)if current_file:current_file.close()split_gene_file("D:\yuceji\Lindera_aggregata.gene.pep", "gene1", 500)files = os.listdir("D:\python\PycharmProjects\pythonProject1\pachou\gene1")result_urls = []for i in range(0, 4):    #可自行設置所需文件數# 設置WebDriver路徑,啟動瀏覽器driver = webdriver.Edge()# 打開網頁url = "https://wolfpsort.hgc.jp/"driver.get(url)time.sleep(5)wuzhong_type = driver.find_element(By.XPATH, '//*[@id="content"]/form/table/tbody/tr[1]/td[1]/p[1]/input[2]')wuzhong_type.click()wenjian_type = driver.find_element(By.XPATH, '//*[@id="content"]/form/table/tbody/tr[1]/td[1]/p[2]/input[2]')wenjian_type.click()input_element = driver.find_element(By.XPATH, '//*[@id="content"]/form/table/tbody/tr[1]/td[1]/p[3]/input')input_element.send_keys(f"D:\python\PycharmProjects\pythonProject1\pachou\gene1\gene_file_{i + 1}.csv")time.sleep(10)# 提交表單submit_button = driver.find_element(By.XPATH, '//*[@id="content"]/form/table/tbody/tr[2]/td/p/input[1]')submit_button.click()time.sleep(30)with open("result_urls","a",encoding="utf-8") as f:# 獲取結果頁面的URLresult_url = driver.current_urlf.write(result_url+ "\n")# 輸出結果頁面的URLprint(result_url)result_urls.append(result_url)# 關閉瀏覽器driver.quit()for i in range(len(result_urls)):r = requests.get(result_urls[i])print(r.status_code)text = r.textlines = text.split("<BR>")AA_ID_list = []yaxibao_list = []for line in lines:if "details" in line:AA_ID = line.split("<A")[0].strip().split()[-1]yaxibao = line.split("details")[1].strip().split()[1][:-1]AA_ID_list.append(AA_ID)yaxibao_list.append(yaxibao)with open(fr"D:\python\PycharmProjects\pythonProject1\pachou\result_dir\yaxibao{i}.csv", "w", encoding="utf-8") as f:f.write("AA_ID, yaxibao\n")  # 寫入列名for j in range(len(AA_ID_list)):f.write(f"{AA_ID_list[j]}, {yaxibao_list[j]}\n")print(result_urls)# 再將所有的結果文件合并為一個大文件
result_csv = r"D:\python\PycharmProjects\pythonProject1\pachou\result_dir"
# 獲取結果文件列表
result_files = os.listdir(result_csv)[:-1]
print(result_files)
# 創建一個空的DataFrame用于存儲合并后的結果
merged_data = pd.DataFrame()
# 遍歷每個結果文件
for file in result_files:# 讀取結果文件df = pd.read_csv(result_csv + "\\" + file)#print(df)# 將結果文件的數據添加到合并后的DataFrame中merged_data = pd.concat([merged_data, df])
#print(merged_data)
# 保存合并后的結果到一個大文件
merged_data.to_csv("merged_results.csv", index=False)

我運行了這個代碼,遍歷前面四個文件,發現都很好的得到了結果頁面的URL。說明這個代碼是可行的。

請添加圖片描述

2. 代碼解釋

這個代碼差不多可以分為四個部分:

  1. 將大文件劃分為小的文件
  2. 使用selenium庫進行模擬用戶行為,以獲得結果頁面的url
  3. 使用requests模塊,通過上一步獲得的url,發送請求,獲取結果頁面,并提取出所需信息
  4. 文件合并操作,使用pandas庫中的concat方法,將前面得到的眾多小文件的結果整合到一個大文件中。

1. 將大文件劃分為小的文件(根據AA的ID數量劃分)

請添加圖片描述

  1. 定義一個split_gene_file()函數,其中"ids_per_file"參數表示指定每個文件中的ID數
  2. 創建一個存儲文件的文件夾
  3. 使用with語句打開源文件,并且遍歷文件中的每一行,之后使用if語句判斷當前行是否是有ID的行,如果不是,就直接將當前行寫入當前文件(current_file);如果是,就將count(表示已讀取到的ID數)的數加上1,然后再判斷已讀取的ID數量是否達到了自己指定的每個文件的ID數量,如果達到了,就表示需要創建一個新的輸出文件output_file, 并將文件對象賦值給current_file變量,使用"w"模式表示以寫入模式打開文件,并將當前行寫入當前文件。
  4. 在處理完源文件后,檢查是否存在當前正在寫入的文件對象。如果是,則關閉該文件。

2. 獲得結果頁面的url

在這里插入圖片描述

這是基于python的selenium庫,
Selenium是一個用于Web自動化的工具,可以用于模擬用戶在網頁瀏覽器上的行為,包括點擊、輸入、提交表單等操作。

其中最主要的步驟還是查看官網頁面的源代碼,通過HTML文本的標簽獲取元素的定位。
例如:
我要查看”Please select an organism type:" ,可以右鍵單擊,然后點擊檢查
在這里插入圖片描述
得到有關信息:
在這里插入圖片描述
比如我在”Please select an organism type:“框中想選擇"Plant”,那么我只要選擇上圖紅框中表示輸入是"plant"的框就行,然后再右鍵選擇復制 “Xpath”
之后再將復制的Xpath粘貼到函數中,充當參數,如下所示:

 wuzhong_type = driver.find_element(By.XPATH, '//*[@id="content"]/form/table/tbody/tr[1]/td[1]/p[1]/input[2]')

因為在這個定位元素函數中,我第一個參數填的是“By.XPATH”,故后面那個參數就便是元素的“Xpath”。

3. 獲取結果頁面,提取出所需信息

請添加圖片描述

對前面得到的URL列表(result_urls)進行循環遍歷,并將得到的結果保存于指定文件中

4. 文件合并操作

請添加圖片描述

前面得到的結果文件是通過循環得到的,故會是眾多小文件。若是欲將所有的結果信息合并于一個大文件中,可以使用pandas庫中的concat方法,來合并文件,最后將循環完畢后的合并結果,保存為一個csv文件。


總結

本章主要簡述了python爬蟲的有關信息,并且進行了一個實操(這個爬蟲是基于WoLF PSORT官網,爬取亞細胞定位結果的數據)。更多有關蛋白質亞細胞定位的信息,請看

亞細胞定位

零落成泥碾作塵,只有香如故。

–2023-8-13 筑基篇

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單認識Zabbix監控系統及配置

文章目錄 一、zabbix概述1、定義2、zabbix監控原理3、監控對象4、zabbix的3種架構&#xff08;1&#xff09; C/S架構&#xff08;2&#xff09;分布式架構&#xff1a;zabbix-proxy-client架構&#xff08;3&#xff09; master-node-client架構 5、zabbix監控模式 二、部署za…

項目實戰 — 消息隊列(8){網絡通信設計①}

目錄 一、自定義應用層協議 &#x1f345; 1、格式定義 &#x1f345; 2、準備工作 &#x1f384;定義請求和響應 &#x1f384; 定義BasicArguments &#x1f384; 定義BasicReturns &#x1f345; 2、創建參數類 &#x1f384; 交換機 &#x1f384; 隊列 &#x1f38…

【網絡】傳輸層——TCP(滑動窗口流量控制擁塞控制延遲應答捎帶應答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;專欄&#xff1a;《網絡》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交給時間&#xff01; 上篇文章對TCP可靠性機制講解了一部分&#xff0c;這篇文章接著繼續講解。 &#x1f3a8;滑動窗口 在…

Springboot 實踐(2)MyEclipse2019創建項目修改pom文件,加載springboot 及swagger-ui jar包

MyEclipse2019創建工程之后&#xff0c;需要添加Springboot啟動函數、添加application.yml配置文件、修改pom文件添加項目使用的jar包。 添加Springboot啟動函數 創建文件存儲路徑 &#xff08;1&#xff09;右鍵單擊“src/main/java”文件夾&#xff0c;彈出對話框輸入路徑…

Android 簡單的視頻、圖片壓縮工具

首頁需要壓縮的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相關權限&#xff08;手機得動態申請權限&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…

05 - 研究 .git 目錄

查看所有文章鏈接&#xff1a;&#xff08;更新中&#xff09;GIT常用場景- 目錄 文章目錄 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git對象一共有三種&#xff1a;數據對象 blob、樹對象 tree以及提交對象 commit&#xff0c;這些對象都被保…

Vue 目錄結構 vite 項目

Vue3 項目常用的目錄結構和每個文件的作用【通過 vite 創建的項目】 vite目錄結構&#xff1a; dist // 打包后生成的文件目錄 node_modules // 環境依賴 public // 公共資源目錄 favicon.ico …

深入探析設計模式:工廠模式的三種姿態

深入探析設計模式&#xff1a;工廠模式的三種姿態 1. 簡單工廠模式1.1 概念1.2 案例1.3 優缺點 2. 抽象工廠模式2.1 概念2.2 案例&#xff1a;跨品牌手機生產2.3 優缺點 3. 超級工廠模式3.1 概念3.2 案例&#xff1a;動物園游覽3.3 優缺點 4. 總結 歡迎閱讀本文&#xff0c;今天…

go入門實踐四-go實現一個簡單的tcp-socks5代理服務

文章目錄 前言socks協議簡介go實現一個簡單的socks5代理運行與壓測抓包驗證 前言 SOCKS是一種網絡傳輸協議&#xff0c;主要用于客戶端與外網服務器之間通訊的中間傳遞。協議在應用層和傳輸層之間。 本文使用先了解socks協議。然后實現一個socks5的tcp代理服務端。最后&#…

英語詞法——代詞

代詞是用來代替名詞、起名詞作用的短語、分句和句子的詞。英語中代詞根據其意義和作用可分為九類:人稱代詞、物主代詞、反身代詞、相互代詞、指示代詞、疑問代詞、不定代詞、關系代詞和連接代詞。 第一節 人稱代詞 一、人稱代詞的形式和用法 人稱代詞單數復數第一人稱第二人…

【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄 __read_mostly 介紹__read_mostly 在 linux 中的使用.data.read_mostly 介紹 __read_mostly 介紹 __read_mostly 是一個在Linux內核編程中用到的宏定義&#xff0c;這是一個gcc編譯器的屬性&#xff0c;用于告訴編譯器此變量主要用于讀取&#xff0c;很少進行寫入&am…

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上&#xff0c;是有個日期字符串&#xff0c;例如2022-07&#xff0c;代表著年月。數據庫中表對于這個字段存的是年月日&#xff0c;例如&#xff1a;2022-07-15。 我希望的是&#xff1a;獲取到2022-07-01到2022-07-31&#xff0c;之間的數據&#xff0c;條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題&#xff0c;原車的地圖在國內定位不了&#xff0c;語音交互功能也識別不了中文&#xff0c;原廠記錄儀也減少了&#xff0c;使用起來也是很不方便的。 可以實現以下功能&#xff1a; ①中國地圖 ②語音小助手&#xff08;你好&#xf…

【BASH】回顧與知識點梳理(二十六)

【BASH】回顧與知識點梳理 二十六 二十六. 二十一至二十五章知識點總結及練習26.1 總結26.2 模擬26.3 簡答題 該系列目錄 --> 【BASH】回顧與知識點梳理&#xff08;目錄&#xff09; 二十六. 二十一至二十五章知識點總結及練習 26.1 總結 Linux 操作系統上面&#xff0c…

unittest單元測試

當你在編寫測試用例時&#xff0c;可以使用Python內置的unittest模塊來進行單元測試。下面是一個逐步指南&#xff0c;幫助你理解如何編寫和運行基本的單元測試。 導入必要的模塊&#xff1a; 首先&#xff0c;你需要導入unittest模塊和需要測試的模塊&#xff08;例如&#xf…

運維監控學習筆記8

在服務器端&#xff0c;我們添加了nginx-server的主機&#xff1a; 在解決Error問題的過程中&#xff0c;我還通過zabbix_get這個命令進行了測試&#xff0c;發現是沒有的&#xff0c;后來確認是在web頁面配置的過程中&#xff0c;我輸錯了密碼。 yum install zabbix-getzabbi…

uniapp-原生地圖截屏返回base64-進行畫板編輯功能

一、場景 vue寫uniapp打包安卓包&#xff0c;實現原生地圖截屏&#xff08;andirod同事做的&#xff09;-畫板編輯功能 實現效果&#xff1a; 二、邏輯步驟簡略 1. 由 原生地圖nvue部分&#xff0c;回調返回 地圖截屏生成的base64 數據&#xff0c; 2. 通過 uni插件市場 im…

《圖解HTTP》——HTTP協議詳解

一、HTTP協議概述 HTTP是一個屬于應用層的面向對象協議&#xff0c;由于其簡捷、快速的方式&#xff0c;適用于分布式超媒體信息系統。它于1990年提出&#xff0c;經過幾年的使用與發展&#xff0c;得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP…

muduo 29 異步日志

目錄 Muduo雙緩沖異步日志模型: 異步日志實現: 為什么要實現非阻塞的日志

SQL 語句解析過程詳解

SQL 語句解析過程詳解&#xff1a; 1&#xff0e;輸入SQL語句 2&#xff0e;詞法分析------flex 使用詞法分析器&#xff08;由Flex生成&#xff09;將 SQL 語句分解為一個個單詞&#xff0c;這些單詞被稱為“標記“。標記包括關鍵字、標識符、運算符、分隔符等。 2.1 flex 原…