python爬蟲7:實戰1

python爬蟲7:實戰1

前言

? python實現網絡爬蟲非常簡單,只需要掌握一定的基礎知識和一定的庫使用技巧即可。本系列目標旨在梳理相關知識點,方便以后復習。

申明

? 本系列所涉及的代碼僅用于個人研究與討論,并不會對網站產生不好影響。

目錄結構

文章目錄

    • python爬蟲7:實戰1
      • 1. 目標
      • 2. 詳細流程
        • 2.1 找到目標小說
        • 2.2 獲取小說章節目錄
        • 2.3 獲取小說內容
        • 2.4 完整代碼
      • 3. 總結

1. 目標

? 這次爬蟲實戰,采用的庫為:requests + lxml,這次以爬取一部小說為目標,具體的網站老規矩就不給了,大家學習思路最重要。

? 再次說明,案例本身并不重要,重要的是如何去使用和分析,另外為了避免侵權之類的問題,我不會放涉及到網站的圖片,希望能理解

2. 詳細流程

2.1 找到目標小說

第一步,確定get請求的url

? 假設我們的網站為:https://xxxxxxx.com,那么,我們首先需要找到搜索框,然后隨意搜索幾本小說,比如這里我搜索的是圣墟萬族之劫,那么觀察網頁上的url變化,如下:

https://xxxxx?q=圣墟
https://xxxxx?q=萬族之劫

? 可以看出,這里是get請求,并且參數名為q

第二步,正確請求網頁

? 我們可以寫下第一個代碼了,目標是獲取想要的小說,代碼如下:

# 都要用到的參數
HEADERS = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}# 獲取搜索某小說后的頁面
def get_search_result():# 網址url = 'xxxxx'# 請求參數search = input('請輸入想要搜索的小說:')params = {'q' : search}# 請求response = requests.get(url,headers=HEADERS,params=params)# 把獲取到的網頁保存到本地with open('search.html','w',encoding='utf-8') as f:f.write(response.content.decode('utf-8'))

? 結果如下:

在這里插入圖片描述

? 可以看出,獲取到正確的網頁,說明這一步我們完成了

正確解析網頁,以獲取小說鏈接

? 上面,我們已經把網頁源碼存放到了本地一個名為search.html的文件,下面我們來解析它。

? 解析它,首先需要明確我們要獲取什么節點、什么值。看下面:

在這里插入圖片描述

? 可以看出,我們的目標標簽位于div[class="mshow"]下的table[class="grid"]下的td下的a標簽,并且我們需要獲取這個a標簽的href屬性和文本值。除此之外,href屬性值只是部分地址,需要跟網站根地址xxxx.com拼湊再一起。

? 基于此,可以完成代碼:

# 解析網頁
def parse_search_result():# 打開文件,讀取文件with open('search.html','r',encoding='utf-8') as f:content = f.read()# 基礎urlbase_url = 'xxxxxx.com/'# 初始化lxmlhtml = etree.HTML(content)# 獲取目標節點href_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/@href')text_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/text()')# 處理內容值url_list = [base_url+href  for href in href_list]# 選擇要爬取的小說for i,text in enumerate(text_list):print('當前小說名為:',text)decision = input('是否爬取它(只能選擇一本),Y/N:')if decision == 'Y':return url_list[i],text

? 運行結果如下:

在這里插入圖片描述

2.2 獲取小說章節目錄

第一步,請求頁面

? 首先,我們去請求上面獲取的網頁,這里就比較簡單了,基本上把上面的請求代碼拷貝過來修改修改即可:

# 請求目標小說網站
def get_target_book(url):# 請求response = requests.get(url,headers=HEADERS)# 保存源碼with open('book.html','w',encoding='utf-8') as f:f.write(response.content.decode('utf-8'))

? 可以看到保存到本地的結果如下:
在這里插入圖片描述

? 可以看出,這一步成功了

第二步,解析上面的網頁,獲取不同章節的鏈接

? 這一步,主要的難點在于解析網頁,首先,看下面:

在這里插入圖片描述

? 由于該網頁小說章節都分為兩個部位,第一個為最新章節,第二個為全部章節,而第二個才是我們需要獲取的,因此xpath語法應該為:

//div[@class="show"]//div[contains(@class,'showBox') and position()=3]//ul//a

? 那么,可以完成代碼如下:

# 解析章節網頁
def parse_chapter(base_url):# 打開文件,讀取內容with open('book.html','r',encoding='utf-8') as f:content = f.read()# 初始化html = etree.HTML(content)# 解析href_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/@href')text_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/text()')# 處理:拼湊出完整網頁url_list = [base_url+url for url in href_list]# 返回結果return url_list,text_list

? 運行結果如下:

在這里插入圖片描述

2.3 獲取小說內容

? 這里我們就不分開了,直接獲取源碼后直接解析。那么這里說明一下解析原理,看下面:

在這里插入圖片描述

? 可以輕松知道xpath語法:

//div[contains(@class,'book')]//div[@id='content']//text()

? 那么,代碼如下:

# 請求小說頁面
def get_content(url,title):# 請求response = requests.get(url,headers=HEADERS)# 獲取源碼content = response.content.decode('utf-8')# 初始化html = etree.HTML(content)# 解析text_list = html.xpath('//div[contains(@class,"book")]//div[@id="content"]//text()')# 后處理# 首先,把第一個和最后一個的廣告信息去掉text_list = text_list[1:-1]# 其次,把里面的空白字符和\xa0去掉text_list = [text.strip().replace('\xa0','') for text in text_list]# 最后,寫入文件即可with open(title+'.txt','w',encoding='utf-8') as g:for text in text_list:g.write(text+'\n')

? 運行結果如下:

在這里插入圖片描述

? 可以看出,成功實現

2.4 完整代碼

? 完整代碼如下:

# author : 自學小白菜
# -*- coding:utf-8 -*-'''
# File Name : 7 lxml_novel.py
# Create Time : 2023/8/5 22:04
# Version : python3.7
# Description :  實戰1:爬取小說
'''# 導包
import requests
from lxml import etree# 都要用到的參數
HEADERS = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}# 獲取搜索某小說后的頁面
def get_search_result():# 網址url = 'https://www.iwurexs.net/so.html'# 請求參數search = input('請輸入想要搜索的小說:')params = {'q' : search}# 請求response = requests.get(url,headers=HEADERS,params=params)# 把獲取到的網頁保存到本地with open('search.html','w',encoding='utf-8') as f:f.write(response.content.decode('utf-8'))# 解析網頁
def parse_search_result():# 打開文件,讀取文件with open('search.html','r',encoding='utf-8') as f:content = f.read()# 基礎urlbase_url = 'https://www.iwurexs.net/'# 初始化lxmlhtml = etree.HTML(content)# 獲取目標節點href_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/@href')text_list = html.xpath('//div[@class="show"]//table[@class="grid"]//td//a/text()')# 處理內容值url_list = [base_url+href  for href in href_list]# 選擇要爬取的小說for i,text in enumerate(text_list):print('當前小說名為:',text)decision = input('是否爬取它(只能選擇一本),Y/N:')if decision == 'Y':return url_list[i],text# 請求目標小說網站
def get_target_book(url):# 請求response = requests.get(url,headers=HEADERS)# 保存源碼with open('book.html','w',encoding='utf-8') as f:f.write(response.content.decode('utf-8'))# 解析章節網頁
def parse_chapter(base_url):# 打開文件,讀取內容with open('book.html','r',encoding='utf-8') as f:content = f.read()# 初始化html = etree.HTML(content)# 解析href_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/@href')text_list = html.xpath('//div[@class="show"]//div[contains(@class,"showBox") and position()=3]//ul//a/text()')# 處理:拼湊出完整網頁url_list = [base_url+url for url in href_list]# 返回結果return url_list,text_list# 請求小說頁面
def get_content(url,title):# 請求response = requests.get(url,headers=HEADERS)# 獲取源碼content = response.content.decode('utf-8')# 初始化html = etree.HTML(content)# 解析text_list = html.xpath('//div[contains(@class,"book")]//div[@id="content"]//text()')# 后處理# 首先,把第一個和最后一個的廣告信息去掉text_list = text_list[1:-1]# 其次,把里面的空白字符和\xa0去掉text_list = [text.strip().replace('\xa0','') for text in text_list]# 最后,寫入文件即可with open(title+'.txt','w',encoding='utf-8') as g:for text in text_list:g.write(text+'\n')if __name__ == '__main__':# 第一步,獲取到搜索頁面的源碼# get_search_result()# 第二步,進行解析target_url,name = parse_search_result()# 第三步,請求目標小說頁面get_target_book(target_url)# 第四步,解析章節網頁url_list,text_list = parse_chapter(target_url)for url,title in zip(url_list,text_list):# 第五步,請求小說具體的某個章節并直接解析get_content(url,title)break

3. 總結

? 上面代碼還不完善,存在一定優化的地方,比如代碼有些地方可以解耦,另外,必須限制訪問速度,不然后期容易被封掉IP,除此之外,可以考慮代理池構建等操作。

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

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

相關文章

carla中lka實現(二)

前言: 首先計算之前檢測出來的車道線的中線與輸入圖像的中線進行計算距離,,并設置不同的閾值對于不同的方向進行相關的調整。 一、車輛中心線 一般而言將攝像頭架設在車輛的正中心軸上,所獲得的圖像的中間線極為車輛的中心。 …

QGraphicsView 實例3地圖瀏覽器

主要介紹Graphics View框架&#xff0c;實現地圖的瀏覽、放大、縮小&#xff0c;以及顯示各個位置的視圖、場景和地圖坐標 效果圖: mapwidget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QLabel> #include <QMouseEvent> #include <QGraphicsView&…

WSL2 ubuntu子系統OpenCV調用本機攝像頭的RTSP視頻流做開發測試

文章目錄 前言一、Ubuntu安裝opencv庫二、啟動 Windows 本機的 RTSP 視頻流下載解壓 EasyDarwin查看本機攝像頭設備開始推流 三、在ubuntu 終端編寫代碼創建目錄及文件創建CMakeLists.txt文件啟動 cmake 配置并構建 四、結果展示啟動圖形界面在圖形界面打開終端找到 rtsp_demo運…

linux系統服務學習(二)linux下yum源配置實戰

文章目錄 Linux下yum源配置實戰一、Linux下軟件包的管理1、軟件安裝方式2、源碼安裝的配置過程3、詳解源碼安裝的配置過程&#xff08;定制&#xff09;4、詳解編譯過程5、安裝過程6、axel多線程下載軟件源碼安裝7、使用軟鏈接解決command not found8、使用環境變量解決command…

軟考A計劃-系統集成項目管理工程師-收尾管理

點擊跳轉專欄>Unity3D特效百例點擊跳轉專欄>案例項目實戰源碼點擊跳轉專欄>游戲腳本-輔助自動化點擊跳轉專欄>Android控件全解手冊點擊跳轉專欄>Scratch編程案例點擊跳轉>軟考全系列點擊跳轉>藍橋系列 &#x1f449;關于作者 專注于Android/Unity和各種游…

字符串的無重復排列組合

題目描述&#xff1a; 無重復字符串的排列組合。編寫一種方法&#xff0c;計算某字符串的所有排列組合&#xff0c;字符串每個字符均不相同。 示例1: 輸入&#xff1a;S "qwe" 輸出&#xff1a;["qwe", "qew", "wqe", "weq&q…

中間件(二)dubbo負載均衡介紹

一、負載均衡概述 支持輪詢、隨機、一致性hash和最小活躍數等。 1、輪詢 ① sequences&#xff1a;內部的序列計數器 ② 服務器接口方法權重一樣&#xff1a;&#xff08;sequences1&#xff09;%服務器的數量&#xff08;決定調用&#xff09;哪個服務器的服務。 ③ 服務器…

opencv直方圖與模板匹配

import cv2 #opencv讀取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 直方圖 cv2.calcHist(images,channels,mask,histSize,ran…

Spring中Bean的生命周期以及Bean的單例與多例模式

一. Bean的生命周期 bean的生命周期可以表達為&#xff1a;bean的定義?bean的初始化?bean的使用?bean的銷毀 Bean的初始化過程 1&#xff09;通過XML、Java annotation&#xff08;注解&#xff09;以及Java Configuration&#xff08;配置類&#xff09; 等方式加載Bea…

2023+HuggingGPT: Solving AI Tasks with ChatGPT and itsFriends in Hugging Face

摘要&#xff1a; 語言是llm(例如ChatGPT)連接眾多AI模型(例如hugs Face)的接口&#xff0c;用于解決復雜的AI任務。在這個概念中&#xff0c;llms作為一個控制器&#xff0c;管理和組織專家模型的合作。LLM首先根據用戶請求規劃任務列表&#xff0c;然后為每個任務分配專家模…

Unity 鼠標實現對物體的移動、縮放、旋轉

文章目錄 1. 代碼2. 測試場景 1. 代碼 using UnityEngine;public class ObjectManipulation : MonoBehaviour {// 縮放比例限制public float MinScale 0.2f;public float MaxScale 3.0f;// 縮放速率private float scaleRate 1f;// 新尺寸private float newScale;// 射線pri…

【Windows系統編程】03.遠線程注入ShellCode

shellcode&#xff1a;本質上也是一段普通的代碼&#xff0c;只不過特殊的編程手法&#xff0c;可以在任意環境下&#xff0c;不依賴于原有的依賴庫執行。 遠程線程 #include <iostream> #include <windows.h> #include <TlHelp32.h>int main(){HANDLE hPr…

Educational Codeforces Round 153 (Rated for Div. 2)ABC

Educational Codeforces Round 153 (Rated for Div. 2) 目錄 A. Not a Substring題目大意思路核心代碼 B. Fancy Coins題目大意思想核心代碼 C. Game on Permutation題目大意思想核心代碼 A. Not a Substring 題目大意 給定一個只包含“&#xff08;”和“&#xff09;”這兩…

react-native-webview RN和html雙向通信

rn登錄后得到的token需要傳遞給網頁&#xff0c;js獲取到的瀏覽器信息需要傳遞給rn RN Index.js: import React from react import { WebView } from react-native-webview import useList from ./useListexport default function Index(props) {const { uri, jsCode, webVie…

iPhone刪除的照片能恢復嗎?不小心誤刪了照片怎么找回?

iPhone最近刪除清空了照片還能恢復嗎&#xff1f;大家都知道&#xff0c;照片對于我們來說是承載著美好回憶的一種形式。它記錄著我們的平淡生活&#xff0c;也留住了我們的美好瞬間&#xff0c;具有極其重要的紀念價值。 照片不小心誤刪是一件非常難受的事&#xff0c;那么iP…

android TextView 超出長度使用省略號

在Android中最常見的需求&#xff0c;就是在在外部展示信息時&#xff0c;需要簡要展示內容。TextView僅需在靜態布局文件中設置以下幾個屬性&#xff1a; android:maxWidth“100dp” // 寬度是多少才算超出 android:maxLines"2" // 高度多少才算超出 android:elli…

React下載文件的兩種方式

React下載文件的兩種方式 - 代碼先鋒網 不知道有用沒用看著挺整齊 沒試過 1、GET類型下載 download url > {const eleLink document.createElement(a);eleLink.style.display none;// eleLink.target "_blank"eleLink.href url;// eleLink.href record;d…

Centos7 配置Docker鏡像加速器

docker實戰(一):centos7 yum安裝docker docker實戰(二):基礎命令篇 docker實戰(三):docker網絡模式(超詳細) docker實戰(四):docker架構原理 docker實戰(五):docker鏡像及倉庫配置 docker實戰(六):docker 網絡及數據卷設置 docker實戰(七):docker 性質及版本選擇 認知升…

CentOS系統環境搭建(五)——Centos7安裝maven

centos系統環境搭建專欄&#x1f517;點擊跳轉 Centos7安裝maven 下載壓縮包 maven下載官網 解壓 壓縮包放置到/usr/local tar -xvf apache-maven-3.9.2-bin.tar.gz配置環境變量 vim /etc/profile在最下面追加 MAVEN_HOME/usr/local/apache-maven-3.9.2 export PATH${MAV…

Jenkins 監控dist.zip文件內容發生變化 觸發自動部署

為Jenkins添加plugin http://xx:xx/manage 創建一個任務 構建觸發器 每3分鐘掃描一次&#xff0c;發現指定文件build.zip文件的MD5發生變化后 觸發任務