python爬蟲爬取數據如何將br去掉_Python怎么去除爬取下來的網站中的一些轉義字符串 - 收獲啦...

基本方法

其實用python爬取網頁很簡單,只有簡單的幾句話

這樣就可以獲得到頁面的內容。接下來再用正則匹配去匹配所需要的內容就行了。但是,真正要做起來,就會有各種各樣的細節問題。

2.登錄

這是一個需要登錄認證的網站。也不太難,只要導入cookielib和urllib庫就行。

這樣就裝載進一個cookie,用urlOpener去open登錄以后就可以記住信息。

3.斷線重連

如果只是做到上面的程度,不對open進行包裝的話,只要網絡狀況有些起伏,就直接拋出異常,退出整個程序,是個很不好的程序。這個時候,只要對異常進行處理,多試幾次就行了:

4.正則匹配

其實正則匹配并不算是一個特別好的方法,因為它的容錯性很不好,網頁要完全統一。如果有稍微的不統一,就會失敗。后來看到說有根據xpath來進行選取的,下次可以嘗試一下。

寫正則其實是有一定技巧的:非貪婪匹配。比如這樣一個標簽:hello,要取出a來,如果寫成這樣的表達式,就不行了:hello。因為*進行了貪婪匹配。這是要用.?:hello。

跨行匹配。實現跨行有一種思路是運用DOTALL標志位,這樣.就會匹配到換行。但是這樣一來,整個匹配過程就會變得很慢。本來的匹配是以行為單位的。整個過程最多就是O(nc2),n是行數,c是平均列數。現在極有可能變為O((nc)2)。我的實現方案是運用來匹配換行,這樣可以明確指出匹配最多跨躍多少行。比如:abc\s*\s*def,就指出查找的是隔一行的。(.)?就可以指定是匹配盡可能少的行。

這里其實還要注意一個點。有的行末是帶有\r的。也就是說一行是以\r結尾的。當初不知道這一點,正則就調試了很久。現在直接用\s,表示行末空格和\r。

無捕獲分組。為了不對捕獲的分組造成影響,上面的(.)可以改為(?:.),這樣捕獲分組時,就會忽略它。

單括號要進行轉義。因為單括號在正則里是用來表示分組的,所以為了匹配單括號就進行轉義。正則字符串最好用的是帶有r前綴的字符串,如果不是的話,則要對\再進行轉義。

快速正則。寫了那么多模式,也總結出一規律出來。先把要匹配的字符相關的段落拿出來。要匹配的東西用(.?)代替。把換行替換為字符串\s\s*,再去掉行首行末的空格。整個過程在vim中可以很快就寫好。

5.Excel操作

這次的數據是放進Excel的。搜索Excel,可以得出幾個方案來,一個是用xlrt/xlwt庫,這個不管電腦上是否安裝了Excel,都可以運行,但只能是xls格式的。還有一個是直接包裝了com,需要電腦上安裝了軟件才行。這里采用的是前一種。

基本的讀寫沒有問題。但是數據量一大起來,就有問題了。內存不夠。程序一跑起來,內存占用就一點一點往上漲。后面再查了一下,知道要用flush_row_data。但是還是會出錯。一看內存占用,沒有什么問題,一直很平穩。但最后還是會出現memoryerror。這真是見鬼了。又是反復地查,反復地運行。一點結果都沒有。要命的是bug只在數據量大起來才出現,而等數據量大起來往往要好幾個小時,這debug的成本實在是太高了。一個偶然的機會,突然發現內存占用,雖然總體平穩,但是會規律性的出現小的高漲,而這規律性,會不會和flush_row_data,有關。一直疑惑的是data被flush到了哪里。原來xlwt的作法是很蛋疼的作法。把數據存在內存里,或者flush到一個temp,到save的時候,再一次性寫入。而問題正出在這一次性寫入,內存猛漲。那我要flush_row_data何用?為什么不一開始就flush進要寫入的地方。

行數限制。這個是xls格式本身決定的,最多行數只能是65536。而且數據一大,文件打開也不方便。

結合以上兩點,最終采取了這么一個策略,如果行數是1000的倍數,進行一次flush,如果行數超過65536,新開一個sheet,如果超過3個sheet,則新建一個文件。為了方便,把xlwt包裝了一下:

6.轉換網頁特殊字符

由于網頁也有自己獨特的轉義字符,在進行正則匹配的時候就有些麻煩。在官方文檔中查到一個用字典替換的方案,私以為不錯,拿來做了一些擴充。其中有一些是為保持正則的正確性。

7.總結

最終的程序要跑很久,其中網絡通信時間占了大部分。是不是可以考慮用多線程重構一下?

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

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

相關文章

Linux基礎

Linux的特點: 系統版本:常見的有debian、Redhat更適合做服務器,更安全和穩定,Ubuntu唯一的優勢就是圖形界面好,centos目前被redhat收購,紅旗已經倒閉。 1、免費的/開源的;2、支持多線程/多用戶&…

GCC的編譯和調試--入門介紹

編譯與調試1.1編譯的概念和理解在進行C程序開發時,編譯就是將編寫的C語言代碼變成可執行程序的過程,這一過程是由編譯器來完成的。編譯器就是完成程序編譯工作的軟件,在進行程序編譯時完成了一系列復雜的過程。1.1.1程序編譯的過程在執行這一…

A* a=new B ,會不會產生內存泄露了,露了B-A的部分?

A* anew B ,delete a;會不會產生內存泄露了,露了B-A的部分。其中B為A的子類 析構函數在下邊3種情況時被調用:1.對象生命周期結束,被銷毀時;2.delete指向對象的指針時,或delete指向對象的基類類型指針,而其基…

spring 第一天:1015

對象加強的三種方法:1/繼承2/裝飾著模式3/動態調用 2:裝飾著模式:就是就是1-先建一個基類 ,如咖啡類 。味道很苦2- 再建一個類配料類 也就是說是所欲配料種類的父類。然后寫多配料子類個子類繼承配料類,。3-子類三個步…

java public 繼承_java繼承問題

代碼:父類:public class Father {public Father() {System.out.println("基類構造函數{");show();new a();System.out.println("}");}public void show() {System.out.println("基類----show");}public class a {public a…

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數(數位DP+惡心細節)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數 Time Limit: 5 Sec Memory Limit: 64 MBDescription 正如你所知,奶牛們沒有手指以至于不能玩“石頭剪刀布”來任意地決定例如誰先擠奶的順序。她們甚至也不能通過仍硬幣的方式。 所以她們通過"round number&q…

Optimizing Code with GCC

現在的編譯器越來越聰明,功能越來越強,從簡單的函數內聯,到復雜的寄存器分析,一系列代碼革命使程序運行得越來越快。大多數時候,更快比更小重要,因為磁盤空間和內存都變得便宜了。但是在嵌入式系統里&#…

QTP的那些事--操作excel的函數

1: QTP Excel函數 操作EXCEL 數據表格 表單 編輯EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生產者消費者模式

經常會有公司叫我們手撕代碼,比如網易,阿里,那我們是不是該掌握下呢。下面這段代碼來自《現代操作系統》進程與線程P49頁。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …

yum查詢已經安裝mysql_通過yum安裝mysql

在linux中安裝數據庫首選MySQL,Mysql數據庫的第一個版本就是發行在Linux系統上,其他選擇還可以有postgreSQL,oracle等在Linux上安裝mysql數據庫,我們可以去其官網上下載mysql數據庫的rpm包,http://dev.mysql.com/downl…

koa2-cookie-session

node.js的path.extname方法使用   由于該方法屬于path模塊,使用前需要引入path模塊(var path require(“path”) )   接收參數:   p path 路徑 path.extname(index.html)// returns.htmlpath.extname(index.)// returns.pat…

從程序員角度看ELF

從程序員角度看ELF原文:《 ELF:From The Programmers Perspective》作者&#xff1a;Hongjiu Lu <mailto: hjlnynexst.com>NYNEX Science & Technology, Inc. 500 Westchester Avenue White Plains, NY 10604, USA 翻譯&#xff1a;alert7 <mailto: alert721cn.co…

JAVA命令符找不到符號_[轉]Java命令行編譯文件時出現的錯誤,找不到符號或軟件包不存在等...

標簽(空格分隔)&#xff1a; Javajavascript習慣了eclipse的自動編譯&#xff0c;Java命令行編譯、執行文件只會最基礎的部分&#xff0c;就是對單文件的編譯和執行&#xff0c;并且不包含任何外部JAR包。但有時候你還非得用命令行&#xff0c;會碰到一些問題&#xff0c;博主這…

C#中POST數據和接收的幾種方式

POST方式提交數據&#xff0c;一種眾所周知的方式&#xff1a; html頁面中使用form表單提交&#xff0c;接收方式&#xff0c;使用Request.Form[""]或Request.QueryString[""]來獲取。 這里介紹另外一種POST方式和接收方式&#xff0c;就是將整個數據作為加…

java自動注入注解_Spring自動注解標簽@Autowired不能注入xml配置的bean嗎?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓配置service的xmlservice代碼public class LoginServiceImpl extends BaseDaoServiceImpl implements LoginService {Overridepublic Map queryByUserName(String userName){IDao iDao super.getAppDao();return (Map)iDao.queryF…

一卡通vip充值消費線上oracle庫服務器故障排查過程

上圖是oracle體系總架構圖今天突然公司所有終端pos機不能刷卡消費&#xff0c;財務室不能充值&#xff0c;一下很多電話打過來了&#xff0c;第一反應肯定數據庫出問題了&#xff0c;登陸到數據庫服務器&#xff0c;果然sqlplus連進去后就不斷提示要求輸入用戶名&#xff0c;彈…

最詳細的Linux下C編程

gcc 目 錄 1. gcc 1. makefile寫法 2. gcc_egcs使用 3. gdb使用 4. gcc常用選項對代碼的影響 1. 一般情況 2. -O 編譯選項 3. -O2 編譯選項 4. -fomit-frame-pointer 編譯選項 5. -fomit-frame-pointer…

sqlserver 存儲過程 增加

CREATE PROCEDURE [dbo].[InsertMessage]( strTable varchar(50), --表名 strValues nvarchar(1000), --要插入的數據&#xff08;用英文逗號分隔&#xff09;,如果是字符串類型&#xff0c;需加單引號 only_field varchar(20)NULL, --唯一性字段(列名) only_valu…

java開發計算機考試服務器_2011計算機二級JAVA編程:取得服務器當前的各種具體時間...

取得服務器當前的各種具體時間/*** 取得服務器當前的各種具體時間* 回車&#xff1a;日期時間*/import java.util.*;public class GetNowDate{Calendar calendar null;public GetNowDate(){calendar Calendar.getInstance();calendar.setTime(new Date());}public int getYea…

(cljs/run-at (JSVM. :all) 細說函數)

前言 作為一門函數式編程語言&#xff0c;深入了解函數的定義和使用自然是十分重要的事情&#xff0c;下面我們一起來學習吧&#xff01; 3種基礎定義方法 defn 定義語法 (defn name [params*]exprs*) 示例 (defn tap [ns x](println ns x)x) fn 定義語法 (fn name? [params*]…