Reptile:requests + Xpath 爬取段子網的段子

2019/1/24?中午路飛學成?爬蟲課程?實驗及筆記。

Xpath是路飛爬蟲課程中老師說的三種解析方式之一,前面是re正則表達式的解析方式,現在是xpath的解析方式,后面還有一個是bs4的解析方式。

re其實我理解的很困難,而且到現在都還不怎么理解這個東西到底應該怎么去組合起來,進行匹配,反而這個Xpath我個人覺得比較好理解,他就是通過一步一步的去解析網頁的結構來找到你想要的東西,比如有一個三級的結構,你就可以用xpath一級一級的去往下走,直到到達你需要的點就ok了。而且還可以進行模糊查找和邏輯查找。

下面是代碼:

# 需求:使用xpath對段子網的內容和標題進行解析,并存儲到本地

  import os

  import requests

from lxml import etree

# 指定本地數據存儲位置
if not os.path.exists('./Duan zi word'):
os.mkdir('Duan zi word')

# 獲取用戶輸入的頁碼范圍
start_page = int(input("Enter a start pageNum:>>>"))
end_page = int(input("Enter a end pageNum:>>>"))

# 打開文件并生成文件句柄
fp = open('Duan zi word/duanzi.txt', 'w', encoding='utf-8')

# 指定url 和請求頭信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/65.0.3325.181 Safari/537.36'
}
for num in range(start_page, end_page + 1, 1):
url = 'http://duanziwang.com/page/' + str(num)

# 發起請求并獲取返回數據:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
page_text = response.text

# 實例化etree對象,并對獲取的網頁數據進行初步解析
tree = etree.HTML(page_text)
article_list = tree.xpath('//article[contains(@id,"")]') # 這里是使用了模糊匹配,用contains取所有包含id的標簽,這個里面和課程有點不一樣,能是網站更新了吧

# 對初步解析得到的數據進行二次解析,得到標題和正文。xpath得到的Element對象都可以再次調用xpath
for li in article_list:
title = li.xpath('./div[@class="post-head"]/h1[1]/a/text()')[0] # 解析初標題的信息,存到變量中后面寫入用 ./是表示在當前標簽下去進行查找,當前標簽就是這個的父級標簽
content = li.xpath('./div[@class="post-content"]/p[1]/text()') # 解析出內容的信息。
try:
fp.write(title + ":" + "\n" + str(content[0]) + "\n\n")
print('\033[31m %s \033[m 已完成寫入' % title)
except:
fp.write(title + ":" + "\n\n")
print('\033[32m索引錯誤\033[m \n')
else:
print("\033[41m鏈接訪問異常,請重新嘗試連接....\033[m")

做這個案例的時候碰到了一個小的問題,就是在后面進行二次解析的時候發現會有拿到的列表中有空的,你對空列表進行切片的時候就會報錯,超出了列表的索引的范圍,沒有想到很好的辦法進行解決,就嘗試使用了
異常處理try 和 except進行處理,沒有問題的就直接寫入到文件里面去,有問題的就給放在except中去執行,只寫一個列表進去,這個問題只存在在內容里面,標題是沒有這樣的問題的,因為標題是都有的,內
容呢可能是有些用戶
沒有去寫吧,或者直接就吧標題當成了內容就保存,就會出現空的列表的問題。


轉載于:https://www.cnblogs.com/wei-yu/p/10317052.html

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

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

相關文章

Android 系統權限

Android 是一個權限分隔的操作系統,其中每個應用都有其獨特的系統標識(Linux 用戶 ID 和組 ID)。系統各部分也分隔為不同的標識。Linux 據此將不同的應用之間、應用與系統之間分隔開來 ##一、安全架構 Android 安全架構的中心設計點是&#x…

【轉載】負數的二進制

https://jingyan.baidu.com/article/29697b9106eb52ab21de3c7a.html 將十進制的負數變成二進制數的過程: 1.寫出絕對值的二進制碼(原碼) 2.取反(反碼) 3.1,(補碼) 同理,將二進制的負…

保存網絡文章以供以后使用Instapaper閱讀

Have you ever come across a bunch of great articles that you want to read online, but just don’t have the time? Today we take a look at an online service that allows you to read your articles later, either online, or on an iPhone, or eReader. 您是否曾經遇…

谷歌chrome xp_將非Google任務列表添加到Chrome

谷歌chrome xpMost people rely on a task list to help them remember what they need to do but not everyone wants one that is tied to a Google account. If you have been wanting an independent tasks list then join us as we look at the Tasks extension for Googl…

學習筆記 - MarkDown 語法

學習參考網址:https://www.appinn.com/markdown/index.html # **gitskill**## 標題 ># 這是 H1 >## 這是 H2 >###### 這是 H6## 區塊引用 Blockquotes > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipisci…

[BZOJ4671]異或圖

description BZOJ 定義兩個結點數相同的圖\(G1\)與圖\(G2\)的異或為一個新的圖\(G\), 其中如果\((u,v)\)在\(G1\)與\(G2\)中的出現次數之和為\(1\), 那么邊\((u,v)\)在\(G\)中, 否則這條邊不在\(G\)中. 現在給定\(s\)個結點數相同的圖\(G1...s\),設\(S{G1,G2,...,Gs},\) 問\(S\…

我們生活在最好的時代

2019獨角獸企業重金招聘Python工程師標準>>> 沒規劃的人生叫拼圖,有規劃的人生叫藍圖; 沒目標的人生叫流浪,有目標的人生叫航行! 我們生活在最好的時代:在認知和學習機會上,人人平等&#xff0c…

MapReduce詳解和WordCount模擬

最早接觸大數據,常縈繞耳邊的一個詞「MapReduce」。它到底是什么,能做什么,原理又是什么?且聽下文講解。 是什么 MapReduce 即是一個編程模型,又是一個計算框架,它充分采用了分治的思想,將數據處…

無法創建系統映像_如何創建USB驅動器的映像

無法創建系統映像You can back up your USB drive by creating a saved image. You can then take that saved image and clone multiple USB sticks. This guide shows you how to create an image of your USB drive using Windows 10. 您可以通過創建保存的圖像來備份USB驅動…

UGUI事件之Drag拖拽事件

UI事件之Drag拖拽事件2.UGUI 事件命名空間   當我們需要使用 UGUI 中的事件的時候,需要在腳本內引入專有命名空間:   using UnityEngine.EventSystems;----------------------------------2.拖拽相關事件接口----------------------------------1.三…

java 通過cookie判斷是否登陸

protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 判斷cookie是否有登錄信息Cookie[] cookies req.getCookies();boolean isLogin false;for(Cookie c : cookies){if("loginInfo".equals(c.getNa…

使用高級管理控制臺獲得對Windows Home Server的擴展訪問

Windows Home Server is easy to setup and use so anyone with basic computer knowledge can operate their own server. But what if you’re an advanced user and want more control over various administrative functions? The Advanced Admin Console Addin gives you…

變動性算法源代碼分析與使用示例(copy_backward、 transform、 replace_copy_if 等)

首先回顧前面的文章,我們把for_each 歸類為非變動性算法,實際上它也可以算是變動性算法,取決于傳入的第三個參數,即函數 指針。如果在函數內對容器元素做了修改,那么就屬于變動性算法。 變動性算法源代碼分析與使用示例…

[轉]QDir類及其用法總結

直接給出原文鏈接:QDir類及其用法總結 轉載于:https://www.cnblogs.com/rainbow70626/p/10330643.html

如何在Outlook中的電子郵件上顯示快速操作按鈕

There are probably actions you regularly perform in Outlook, such as deleting, archiving, and marking things as read. Here’s how to use Quick Action buttons to add one-click options that appear over every email to perform each action. 您可能會在Outlook中定…

c++讀取和寫入TXT文件的整理

c讀取和寫入TXT文件的整理 #include "stdafx.h" #include <iostream> //無論讀寫都要包含<fstream>頭文件 #include <fstream> #include <iomanip> using namespace std;int main() {//ifstream從文件流向內存的ifstream表示文件輸入流…

使用RestTemplate時報錯java.lang.IllegalStateException: No instances available for 127.0.0.1

我在RestTemplate的配置類里使用了 LoadBalancedComponentpublic class RestTemplateConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }}或者 再調用Autowiredprivate RestTemplate restTemplate;必須使用應用名作為代替ip:端口&a…

sh變量特性(3)默認特性

變量說明$0當前腳本的文件名$n傳遞給腳本或函數的參數&#xff0c;n是數字&#xff0c;第n個參數$#傳遞給腳本或函數的參數個數$*傳遞給腳本或函數的所有參數$傳遞給腳本或函數的所有參數。被””包含時&#xff0c;與$*稍有不同$?上個命令的退出狀態&#xff0c;或函數返回值…

zune linux_更新您的Zune Player軟件

zune linuxKeeping your computer and software up to date is very important in keeping everything running smooth and secure. It’s also important to keep your geeky gadgets updated as well. Here we take a look at updating a Zune HD. 保持計算機和軟件的最新狀態…

繼承的幾種方式

1.借助構造函數實現繼承 function Parent() { this.name parent } Parent.prototype.say function () { // 不能被繼承 this.say function() { console.log(hello this.name) } } function Child() { Parent.call(this) this.type child } console.log(new Child) // 沒有參…