『壹』 python什麼爬蟲庫好用
Python下的爬蟲庫,一般分為3類。
抓取類
urllib(Python3),這是Python自帶的庫,可以模擬瀏覽器的請求,獲得Response用來解析,其中提供了豐富的請求手段,支持Cookies、Headers等各類參數,眾多爬蟲庫基本上都是基於它構建的。建議學習了解一下,因為有些罕見的問題需要通過底層的方式解決。
requests,基於urllib,但是更方便易用。強烈推薦掌握。
解析類
re:正則表達式官方庫,不僅僅是學習爬蟲要使用,在其他字元串處理或者自然語言處理的過程中,這是繞不過去的一個庫,強烈推薦掌宴喚模握。
BeautifulSoup:方便易用,好上手,推薦掌握。通過選擇器的方式選取頁面元素,並獲取對應的內容。
lxml:使用
lxml.etree
將字元串轉換之後,我們可以使用XPath表達式來解析網頁,終極推薦。XPath對於網頁解析的支持非常強大,而且很容易上手。它本來是設計出來進行XML元素選擇的,但是它同樣支持HTML。pyquery:另一個強大的解析庫,感興趣的可以學習下。
綜合類
selenium:所見即所得式爬蟲,綜合了抓取和解析兩種功能,一站式解決。很多動態網頁不太容易通過requests、scrapy直接抓取,比如有些url後邊帶了加密的隨晌緩機數,這些演算法不太好破解,這種情況下,只能通過直接訪問網址、模擬登陸等方式請求到頁面源碼,直接從網頁元素中解析內容,這種情況下,Selenium就是最好的選擇。不過Selenium最初設計出來,是用於測試的。強烈推薦。
scrapy:另一個爬蟲神器,適合爬取大量頁面,甚至對分布式爬蟲提供了良好的支持。強烈鏈悶推薦。
以上這些是我個人經常使用的庫,但是還有很多其他的工具值得學習。比如Splash也支持動態網頁的抓取;Appium可以幫助我們抓取App的內容;Charles可以幫助我們抓包,不管是移動端還是PC網頁端,都有良好的支持;pyspider也是一個綜合性的框架;MySQL(pymysql)、MongoDB(pymongo),抓到了數據就要存儲,資料庫也是繞不過去的。
掌握了以上這些,基本上大部分的爬蟲任務都難不倒你啦!
『貳』 Python的爬蟲框架有哪些
向大家推薦十個Python爬蟲框架。
1、Scrapy:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。它是很強大的爬蟲框架,可以滿足簡單的頁面爬取,比如可以明確獲知url pattern的情況。用這個框架可以輕松爬下來如亞馬遜商品信息之類的數據。但是對於稍微復雜一點的頁面,如weibo的頁面信息,這個框架就滿足不了需求了。它的特性有:HTML, XML源數據 選擇及提取 的內置支持;提供了一系列在spider之間共享的可復用的過濾器(即 Item Loaders),對智能處理爬取數據提供了內置支持。
2、Crawley:高速爬取對應網站的內容,支持關系和非關系資料庫,數據可以導出為JSON、XML等。
3、Portia:是一個開源可視化爬蟲工具,可讓使用者在不需要任何編程知識的情況下爬取網站!簡單地注釋自己感興趣的頁面,Portia將創建一個蜘蛛來從類似的頁面提取數據。簡單來講,它是基於scrapy內核;可視化爬取內容,不需要任何開發專業知識;動態匹配相同模板的內容。
4、newspaper:可以用來提取新聞、文章和內容分析。使用多線程,支持10多種語言等。作者從requests庫的簡潔與強大得到靈感,使用Python開發的可用於提取文章內容的程序。支持10多種語言並且所有的都是unicode編碼。
5、Python-goose:Java寫的文章提取工具。Python-goose框架可提取的信息包括:文章主體內容、文章主要圖片、文章中嵌入的任何Youtube/Vimeo視頻、元描述、元標簽。
6、Beautiful Soup:名氣大,整合了一些常用爬蟲需求。它是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間。Beautiful Soup的缺點是不能載入JS。
7、mechanize:它的優點是可以載入JS。當然它也有缺點,比如文檔嚴重缺失。不過通過官方的example以及人肉嘗試的方法,還是勉強能用的。
8、selenium:這是一個調用瀏覽器的driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。Selenium是自動化測試工具,它支持各種瀏覽器,包括 Chrome,Safari,Firefox等主流界面式瀏覽器,如果在這些瀏覽器裡面安裝一個 Selenium 的插件,可以方便地實現Web界面的測試. Selenium支持瀏覽器驅動。Selenium支持多種語言開發,比如 Java,C,Ruby等等,PhantomJS 用來渲染解析JS,Selenium 用來驅動以及與Python的對接,Python進行後期的處理。
9、cola:是一個分布式的爬蟲框架,對於用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多台機器上,整個過程對用戶是透明的。項目整體設計有點糟,模塊間耦合度較高。
10、PySpider:一個國人編寫的強大的網路爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分布式架構,支持多種資料庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。Python腳本控制,可以用任何你喜歡的html解析包。
以上就是分享的Python爬蟲一般用的十大主流框架。這些框架的優缺點都不同,大家在使用的時候,可以根據具體場景選擇合適的框架。
『叄』 如何使用Python和xml.etree.ElementTree解析xml文件獲取其節點
<?xmlversion="1.0"encoding="utf-8"?>
<root>
<bodyname="lyc">
<age>110</age>
</body>
<bodyname="l"age="10">
</body>
</root>
######################
#coding=UTF8
fromxml.etreeimportElementTree
#xmlText=open("xml.txt").read()
#root=ElementTree.fromstring(xmlText)
root=ElementTree.parse("xml.txt")
bodys=root.getiterator("body")
#getiterator方法獲取
print"getiterator"
printbodys
printdir(bodys[0])
print"attrib:",bodys[0].attrib
print"tag:",bodys[0].tag
print"text",bodys[0].text
#getchildren方法獲取
print"getchildren"
children=bodys[0].getchildren()
printchildren
print"attrib:",children[0].attrib
print"tag:",children[0].tag
print"text:",children[0].text
#find
print"find"
children=root.find("body")
printchildren
print"attrib:",children.attrib
print"tag:",children.tag
print"text:",children.text
#findall
print"findall"
children=root.findall("body")
printchildren
print"attrib:",children[0].attrib
print"tag:",children[0].tag
print"text:",children[0].text
『肆』 python lxml etree怎麼甩
lxml是Python語言中處理XML和HTML功能最豐富,最易於使用的庫。
lxml是libxml2和libxslt兩個C庫的Python化綁定,它的獨特之處在於兼顧了這些庫的速度和功能完整性,同時還具有Python API的簡介。兼容ElementTree API,但是比它更優越。
用libxml2編程就像是一個異於常人的陌生人的令人驚恐的擁抱,它看上去可以滿足你一切瘋狂的夢想,但是你的內心深處一直在警告你,你有可能會以最糟糕的方式遭殃,所以就有了lxml。
這是一個用lxml.etree來處理XML的教程,它簡單的概述了ElementTree API的主要概念,同時有一些能讓你的程序生涯更輕松的簡單的提高。
首先是導入lxml.etree的方式:
fromlxmlimportetree
為了協助代碼的可移植性,本教程中的例子很明顯可以看出,一部分API是lxml.etree在ElementTree API(由Fredrik Lundh 的ElementTree庫定義)的基礎上的擴展。
Element是ElementTree API的主要容器類,大部分XML tree的功能都是通過這個類來實現的,Element的創建很容易:
root=etree.Element("root")
element的XML tag名通過tag屬性來訪問
>>>printroot.tag
root
許多Element被組織成一個XML樹狀結構,創建一個子element並添加進父element使用append方法:
>>>root.append(etree.Element("child1"))
還有一個更簡短更有效的方法:the SubElement,它的參數和element一樣,但是需要父element作為第一個參數:
>>>child2=etree.SubElement(root,"child2")
>>>child3=etree.SubElement(root,"child3")
可以序列化你創建的樹:
>>>print(etree.tostring(root,pretty_print=True))
<root>
<child1/>
<child2/>
<child3/>
</root>
為了更方便直觀的訪問這些子節點,element模仿了正常的Python鏈:
>>>child=root[0]>>>print(child.tag)
child1
>>>print(len(root))
>>>root.index(root[1])#lxml.etreeonly!
>>>children=list(root)>>>forchildinroot:...print(child.tag)child1child2
child3
>>>root.insert(0,etree.Element("child0"))>>>start=root[:1]>>>end=root[-1:]>>>print(start[0].tag)child0>>>print(end[0].tag)child3
還可以根據element的真值看其是否有孩子節點:
ifroot:#thisnolongerworks!
print("Therootelementhaschildren")
用len(element)更直觀,且不容易出錯:
>>>print(etree.iselement(root))#testifit'ssomekindofElement
True
>>>iflen(root):#testifithaschildren
...print("Therootelementhaschildren")
Therootelementhaschildren
還有一個重要的特性,原文的句子只可意會,看例子應該是能看懂什麼意思吧。
>>>forchildinroot:...print(child.tag)child0child1child2child3>>>root[0]=root[-1]#移動了element>>>forchildinroot:...print(child.tag)child3child1child2>>>l=[0,1,2,3]>>>l[0]=l[-1]>>>l[3,1,2,3]
>>>rootisroot[0].getparent()#lxml.etreeonly!.etree,'sstandardlibrary:>>>fromimportdeep>>>element=etree.Element("neu")>>>element.append(deep(root[1]))>>>print(element[0].tag)child1>>>print([c.tagforcinroot])['child3','child1','child2']
XML支持屬性,創建方式如下:
>>>root=etree.Element("root",interesting="totally")
>>>etree.tostring(root)
b'<rootinteresting="totally"/>'
屬性是無序的鍵值對,所以可以用element類似於字典介面的方式處理:
>>>print(root.get("interesting"))
totally
>>>print(root.get("hello"))
None
>>>root.set("hello","Huhu")
>>>print(root.get("hello"))
Huhu
>>>etree.tostring(root)
b'<rootinteresting="totally"hello="Huhu"/>'
>>>sorted(root.keys())
['hello','interesting']
>>>forname,valueinsorted(root.items()):
...print('%s=%r'%(name,value))
hello='Huhu'
interesting='totally'
如果需要獲得一個類似dict的對象,可以使用attrib屬性:
>>>attributes=root.attrib
>>>print(attributes["interesting"])
totally
>>>print(attributes.get("no-such-attribute"))
None
>>>attributes["hello"]="GutenTag"
>>>print(attributes["hello"])
GutenTag
>>>print(root.get("hello"))
GutenTag
既然attrib是element本身支持的類似dict的對象,這就意味著任何對element的改變都會影響attrib,反之亦然。這還意味著只要element的任何一個attrib還在使用,XML樹就一直在內存中。通過如下方法,可以獲得一個獨立於XML樹的attrib的快照:
>>>d=dict(root.attrib)
>>>sorted(d.items())
[('hello','GutenTag'),('interesting','totally')]
『伍』 python找不到etree怎麼解決
解決python找不早洞粗到etree的方法:
重新下載安裝etree模塊。方法:打開顫猜cmd,輸入pip install lxml命令進行下載安裝,之後再調用就可以了
示例如下陸鎮:
更多Python知識,請關註:Python自學網!!
『陸』 用python爬取關鍵詞並解釋
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
python
打開APP
小羊努力搞代碼
關注
學習日誌:Python 實現網路爬蟲——提取關鍵字 原創
2022-06-19 13:02:38
小羊努力搞代碼
碼齡174天
關注
編寫一段Python代碼,向網路提交查詢關鍵詞「桃花源記」,抓取網路的查詢結果,要求有文字、鏈接,可以在瀏覽器中打開抓取的鏈接,或者調用瀏覽器打開抓取的鏈接。
紅框內是根據網站信息需要更改的內容。.png
附上完整代碼:
import json
import requests
from lxml import etree
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/88.0.4324.104 Safari/537.36"
}
response = requests.get('https://www..com/s?wd=桃花源記&lm=0', headers=headers)
r = response.text
html = etree.HTML(r, etree.HTMLParser())
r1 = html.xpath('//h3')
r2 = html.xpath('//*[@class="content-right_8Zs40"]')
r3 = html.xpath('//*[@class="c-row source_1Vdff OP_LOG_LINK c-gap-top-xsmall"]/a/@href')
for i in range(4):
r11 = r1[i].xpath('string(.)')
r22 = r2[i].xpath('string(.)')
r33 = r3[i]
with open('桃花源記.txt', 'a', encoding='utf-8') as c:
c.write(json.mps(r11,ensure_ascii=False) + '\n')
c.write(json.mps(r22, ensure_ascii=False) + '\n')
c.write(json.mps(r33, ensure_ascii=False) + '\n')
print(r11, end='\n')
print('------------------------')
print(r22, end='\n')
print(r33)