摘要:大奉打更人賣(mài)報(bào)小郎君這個(gè)人仙太過(guò)正經(jīng)言歸正傳從紅月開(kāi)始黑山老鬼穩(wěn)住別浪跳舞二解析數(shù)據(jù)是一個(gè)可以從或文件中提取數(shù)據(jù)的庫(kù)。
目錄
4、課堂案例 - 爬取起點(diǎn)小說(shuō)網(wǎng)
3、使用BeautifulSoup爬取淘寶網(wǎng)首頁(yè)
4、課堂案例(爬取起點(diǎn)小說(shuō)網(wǎng))
序號(hào) | 表達(dá)式 | 描述 |
1 | nodename | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn) |
2 | / | 從根節(jié)點(diǎn)選擇 |
3 | // | 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置 |
4 | . | 選取當(dāng)前節(jié)點(diǎn) |
5 | .. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
6 | /text() | 選取當(dāng)前路徑下的文本內(nèi)容 |
7 | /@xxx | 提取當(dāng)前路徑下標(biāo)簽的屬性值 |
8 | |可選符 | 可選擇若干個(gè)路徑//p|//div,在當(dāng)前路徑下選取所有符合條件的p標(biāo)簽和div標(biāo)簽 |
序號(hào) | 表達(dá)式 | 描述 |
1 | xpath("./body/div[1]") | 選取body下的第一個(gè)div節(jié)點(diǎn) |
2 | xpath("./body/div[ last() ]") | 選取body下最后一個(gè)div節(jié)點(diǎn) |
3 | xpath("./body/div[ last()-1 ]") | 選取body下倒數(shù)第二個(gè)div節(jié)點(diǎn) |
4 | xpath("./body/div[ position()<3 ]") | 選取body下前兩個(gè)div節(jié)點(diǎn) |
5 | xpath("./body/div[ @class ]") | 選取body下帶有class屬性的div節(jié)點(diǎn) |
6 | xpath("./body/div[ @class="main" ]") | 選取body下class屬性為main的div節(jié)點(diǎn) |
7 | xpath("./body/div[ price>35.00 ]") | 選取body下price元素大于35的div節(jié)點(diǎn) |
import requestsfrom lxml import etreeurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}# 發(fā)送請(qǐng)求resp=requests.get(url,headers)e=etree.HTML(resp.text) # 類(lèi)型轉(zhuǎn)換,把str類(lèi)型轉(zhuǎn)換成class "lxml.etree._Element"# print(type(e)) # names=e.xpath("http://div[@class="book-mid-info"]/h4/a/text()") # 獲取小說(shuō)名稱authors=e.xpath("http://p[@class="author"]/a[1]/text()") # 獲取小說(shuō)作者# print(names) # ["大奉打更人", "這個(gè)人仙太過(guò)正經(jīng)", "從紅月開(kāi)始", "穩(wěn)住別浪", 。。。]# print(authors) # ["賣(mài)報(bào)小郎君", "言歸正傳", "黑山老鬼", "跳舞", "我最白", 。。。]for name,author in zip(names,authors): print(name, ":", author)# 大奉打更人 : 賣(mài)報(bào)小郎君# 這個(gè)人仙太過(guò)正經(jīng) : 言歸正傳# 從紅月開(kāi)始 : 黑山老鬼# 穩(wěn)住別浪 : 跳舞# ... ...
序號(hào) | 解析器 | 使用方法 | 優(yōu)點(diǎn) | 缺點(diǎn) |
1 | 標(biāo)準(zhǔn)庫(kù) | BeautifulSoup(html,"html.parser") | 內(nèi)置標(biāo)準(zhǔn)庫(kù),速度適中,文檔容錯(cuò)能力強(qiáng) | Python3.2版本前的文檔容錯(cuò)能力差 |
2 | lxml HTML | BeautifulSoup(html, "lxml") | 速度快,文檔容錯(cuò)能力強(qiáng) | 安裝C語(yǔ)言庫(kù) |
3 | lxml XML | BeautifulSoup(html, "xml") | 速度快,唯一支持XML | 安裝C語(yǔ)言庫(kù) |
4 | html5lib | BeautifulSoup(html, "html5lib") | 容錯(cuò)能力最強(qiáng),可生成HTML5 | 運(yùn)行慢,擴(kuò)展差 |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 早起對(duì)自己說(shuō):我真美!
百度 """# bs=BeautifulSoup(html, "html.parser")bs=BeautifulSoup(html, "lxml")print(bs.title) # 獲取標(biāo)題 今天又是美好的一天 print(bs.h1.attrs) # 獲取h1標(biāo)簽的所有屬性 {"class": ["info", "bg"], "float": "left"}# 獲取單個(gè)屬性print(bs.h1.get("class")) # ["info", "bg"]print(bs.h1["class"]) # ["info", "bg"]print(bs.a["href"]) # http://www.baidu.com# 獲取文本內(nèi)容print(bs.title.text) # 今天又是美好的一天print(bs.title.string) # 今天又是美好的一天# 獲取內(nèi)容print("-----", bs.h2.string) # ----- 注釋的內(nèi)容print("-----", bs.h2.text) # -----# string可以獲取注釋的內(nèi)容,但是text不能獲取注釋內(nèi)容
返回值類(lèi)型 | 方法 | 功能 | 語(yǔ)法 | 舉例 |
Tag | find() | 提取滿足要求的首個(gè)數(shù)據(jù) | bs.find(標(biāo)簽,屬性) | bs.find("div", class_="books") |
Tag | find_all() | 提取滿足要求的所有數(shù)據(jù) | bs.find_all(標(biāo)簽,屬性) | bs.find_all("div", class_="books") |
功能 | 舉例 |
通過(guò)ID查找 | bs.select("#abc") |
通過(guò)classa查找 | bs.select(".abc") |
通過(guò)屬性查找 | bs.select(a[" class="abc" "]) |
功能 | 舉例 |
獲取標(biāo)簽 | bs.title |
獲取所有屬性 | bs.title.attrs |
獲取單個(gè)屬性的值 | bs.div.get("class") bs.div["class"] bs.a["href"] |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 今天又是美好的一天 好好學(xué)習(xí),天天向上 百度 人生苦短,唯有愛(ài)情"""bs=BeautifulSoup(html, "lxml")print(bs.title, type(bs.title)) # 獲取標(biāo)題及其類(lèi)型# 今天又是美好的一天 print(bs.find("div",class_="info"), type(bs.find("div",class_="info"))) # 獲取第一個(gè)滿足條件的標(biāo)簽# 今天又是美好的一天 print(bs.find_all("div", class_="info")) # 得到的是一個(gè)標(biāo)簽的列表# [今天又是美好的一天, # 好好學(xué)習(xí),天天向上# 百度# ]for item in bs.find_all("div",class_="info"): print(item, type(item))print(bs.find_all("div", attrs={"float":"right"})) # 得到屬性為"float":"right"的div標(biāo)簽print("---------------CSS選擇器---------------------")print(bs.select("#gb"))print(bs.select(".info"))print(bs.select("div>span")) # [好好學(xué)習(xí),天天向上]print(bs.select("div.info>span")) # [好好學(xué)習(xí),天天向上]for item in bs.select("div.info>span"): print(item.text) # 好好學(xué)習(xí),天天向上
import requestsfrom bs4 import BeautifulSoupurl="https://www.taobao.com/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text) # ... ...bs=BeautifulSoup(resp.text,"lxml")a_list=bs.find_all("a")# print(len(a_list)) # 128for a in a_list: url=a.get("href") # print(url) if url==None: continue if url.startswith("http") or url.startswith("https"): print(url)
序號(hào) | 元字符 | 說(shuō)明 |
1 | . | 匹配任意字符(不包括/n) |
2 | ^ | 匹配字符串的開(kāi)頭 |
3 | $ | 匹配字符的末尾 |
4 | * | 匹配前一個(gè)元字符0到多次 |
5 | + | 匹配前一個(gè)元字符1到多次 |
6 | ? | 匹配前一個(gè)元字符0到1次 |
7 | {m} | 匹配前一個(gè)字符m次 |
8 | {m,n} | 匹配前一個(gè)字符m到n次 |
9 | {m,n}? | 匹配前一個(gè)字符m到n次,并且取盡可能少的情況 |
10 | // | 對(duì)特殊字符進(jìn)行轉(zhuǎn)義 |
11 | [] | 一個(gè)字符的集合,可匹配其中任意一個(gè)字符 |
12 | | | 邏輯表達(dá)式“或”,比如 a|b 代表可匹配a或者b |
13 | (...) | 被括起來(lái)的表達(dá)式作為一個(gè)元組。findall()在有組的情況下只顯示組的內(nèi)容 |
序號(hào) | 元字符 | 說(shuō)明 |
1 | /A | 只在字符串開(kāi)頭進(jìn)行匹配 |
2 | /b | 匹配位于開(kāi)頭或者結(jié)尾的空字符串 |
3 | /B | 匹配不位于開(kāi)頭或者結(jié)尾的空字符串 |
4 | /d | 匹配任意十進(jìn)制數(shù),相當(dāng)于[0-9] |
5 | /D | 匹配任意非數(shù)字字符,相當(dāng)于[^0-9] |
6 | /s | 匹配任意空白字符,相當(dāng)于[/t/n/r/f/v] |
7 | /S | 匹配任意非空白字符,相當(dāng)于[^/t/n/r/f/v] |
8 | /w | 匹配任意數(shù)字、字母、下劃線,相當(dāng)于[a-zA-Z0-9_] |
9 | /W | 匹配任意非數(shù)字、字母、下劃線,相當(dāng)于[^a-zA-Z0-9_] |
10 | /Z | 只在字符串結(jié)尾進(jìn)行匹配 |
11 | [/u4e00-/u9fa5] | 中文 |
序號(hào) | 正則處理函數(shù) | 說(shuō)明 |
1 | re.match(pattern, string, flags=0) | 嘗試從字符串的開(kāi)始位置匹配一個(gè)模式,如果匹配成功,就返回一個(gè)匹配成功的對(duì)象,否則返回None |
2 | re.search(pattern, string, flags=0) | 掃描整個(gè)字符串并返回第一次成功匹配的對(duì)象,如果匹配失敗,就返回None |
3 | re.findall(pattern, string, flags=0) | 獲取字符串中所有匹配的字符串,并以列表的形式返回 |
4 | re.sub(pattern, repl, string, count=0,flags=0) | 用于替換字符串中的匹配項(xiàng),如果沒(méi)有匹配的項(xiàng)則返回沒(méi)有匹配的字符串 |
5 | re.compile(pattern[ ,flags ]) | 用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式(Pattern)對(duì)象,供match()和search()函數(shù)使用 |
import res = "I study Python3.8 every day"print("--------match方法,從起始位置開(kāi)始匹配--------")print(re.match("I", s).group()) # Iprint(re.match("/w", s).group()) # Iprint(re.match(".", s).group()) # Iprint("--------search方法,從任意位置開(kāi)始匹配,匹配第一個(gè)--------")print(re.search("study", s).group()) # studyprint(re.search("s/w", s).group()) # stprint("--------findall方法,從任意位置開(kāi)始匹配,匹配多個(gè)--------")print(re.findall("y", s)) # 結(jié)果為數(shù)組 ["y", "y", "y", "y"]print(re.findall("Python", s)) # ["Python"]print(re.findall("P/w+./d", s)) # ["Python3.8"]print(re.findall("P.+/d", s)) # ["Python3.8"]print("--------sub方法的使用,替換功能--------")print(re.sub("study", "like", s)) # 將study替換成like I like Python3.8 every dayprint(re.sub("s/w+", "like", s)) # I like Python3.8 every day
爬取數(shù)據(jù)時(shí),一定要記得先找F12代碼,看看和爬取的數(shù)據(jù)是否一致,若一致,則可直接提取。
import reimport requestsurl="http://www.qiushibaike.com/video/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers=headers)# print(resp.text)# 先隨便找一個(gè)視頻,看是否能提取到。單引號(hào)中的單引號(hào)用/轉(zhuǎn)義:/".../"# info=re.findall("", resp.text)# print(info) # [""]info=re.findall("", resp.text)# print(info) # 給出所有URL的相對(duì)位置的數(shù)組lst=[]for item in info: lst.append("https:"+item)# print(lst)# 循環(huán)count=0for item in lst: count+=1 resp=requests.get(item, headers=headers) # 轉(zhuǎn)成二進(jìn)制存儲(chǔ) with open("video/"+str(count)+".mp4", "wb") as file: file.write(resp.content)print("視頻下載完畢")
用正則表達(dá)式提取51job網(wǎng)頁(yè)中的信息
import requestsimport refrom pandas import DataFrame # 網(wǎng)址url = "https://search.51job.com/list/000000,000000,0000,32,9,99,Java%25E5%25BC%2580%25E5%258F%2591,2,1.html"# 獲得網(wǎng)頁(yè)對(duì)象res = requests.get(url)# 設(shè)置編碼格式res.encoding = "gbk" # 職位名# 將要提取的用(.*)表示,每條數(shù)據(jù)不同的地方用.*表示position_pat = "" position = re.findall(position_pat, res.text) # 公司名company_pat = ".*"company = re.findall(company_pat, res.text) # 工作地點(diǎn)place_pat = ".*?(.*?)" # 非貪婪模式place = re.findall(place_pat, res.text, re.S) # 薪資salary_pat = ".*?(.*?)" # 非貪婪模式salary = re.findall(salary_pat, res.text, re.S) # 將取出的信息放到數(shù)據(jù)框jobInfo = DataFrame([position, company, place, salary]).T# 設(shè)置列名jobInfo.columns = ["職位名", "公司名", "工作地點(diǎn)", "薪資"]print(jobInfo.head()) # 將數(shù)據(jù)保存到本地jobInfo.to_csv("51job2.csv") 四、pyquery解析數(shù)據(jù)
1、pyquery
- pyquery庫(kù)是jQuery的Python實(shí)現(xiàn),就能以jQuery的語(yǔ)法來(lái)操作解析HTML文檔,易用性和解析速度都很好
- 前提條件:
- 你對(duì)CSS選擇器與jQuery有所了解
- 非Python標(biāo)準(zhǔn)模塊,需要安裝
- 安裝方式
- pip install pyquery
- 測(cè)試方式
- import pyquery
2、pyquery的初始化方式
- 字符串方式
- url方式
- 文件
# 字符串方式from pyquery import PyQuery as pyhtml=""" PyQuery PyQuery
"""doc=py(html) # 創(chuàng)建PyQuery的對(duì)象,實(shí)際上就是在進(jìn)行一個(gè)類(lèi)型轉(zhuǎn)換,將str類(lèi)型轉(zhuǎn)成PyQuery類(lèi)型print(doc) # 和html一樣的內(nèi)容print(type(doc)) # print(type(html)) # print(doc("title")) # PyQuery
# url方式from pyquery import PyQuerydoc=PyQuery(url="http://www.baidu.com", encoding="utf-8")print(doc) # 獲取htmlprint(doc("title")) # 百度一下,你就知道
# 文件from pyquery import PyQuerydoc=PyQuery(filename="a1.html")print(doc) # 獲取htmlprint(doc("h1")) # PyQuery
3、pyquery的使用
序號(hào)
提取數(shù)據(jù)
舉例
1
獲取當(dāng)前節(jié)點(diǎn)
doc("#main")
2
獲取子節(jié)點(diǎn)
doc("#main").children()
3
獲取父節(jié)點(diǎn)
doc("#main").parent()
4
獲取兄弟節(jié)點(diǎn)
doc("#main").siblings()
5
獲取屬性
doc("#main").attr("href")
6
獲取內(nèi)容
doc("#main").html() doc("#main").text()
from pyquery import PyQueryhtml=""" PyQuery 百度 百度一下
Python學(xué)習(xí)
"""doc=PyQuery(html)# 獲取當(dāng)前節(jié)點(diǎn)print(doc("#main")) # 獲取整個(gè)div# 獲取父節(jié)點(diǎn)print(doc("#main").parent()) # 獲取整個(gè)body# 獲取子節(jié)點(diǎn)print(doc("#main").children()) # 獲取和# # 獲取兄弟節(jié)點(diǎn)print(doc("#main").siblings()) # 獲取print("----------獲取屬性------------")print(doc("a").attr("href")) # http://www.baidu.comprint("----------獲取標(biāo)簽的內(nèi)容------------")print(doc("#main").html()) # 獲取和,div中的所有都獲取到了print(doc("#main").text()) # 百度 百度一下, 只獲取了div中的文本
4、課堂案例(爬取起點(diǎn)小說(shuō)網(wǎng))
import requestsfrom pyquery import PyQueryurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text)# 初始化PyQuery對(duì)象doc=PyQuery(resp.text) # 使用字符串初始化方式初始化PyQuery對(duì)象# a_tag=doc("h4 a") # 獲取h4的a標(biāo)簽# print(a_tag)names=[a.text for a in doc("h4 a")]# print(names) # ["大奉打更人", "這個(gè)人仙太過(guò)正經(jīng)", "從紅月開(kāi)始", "穩(wěn)住別浪",....]authors = doc("p.author a") # 找
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/124512.html
摘要:以下這些項(xiàng)目,你拿來(lái)學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲(chóng)達(dá)到效率最高,也就是所謂的爬蟲(chóng)策略問(wèn)題,爬蟲(chóng)策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲(chóng)的設(shè)計(jì)方案,比如說(shuō)。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過(guò)一遍Python最基本的知識(shí),比如說(shuō):變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法...
摘要:什么是爬蟲(chóng)網(wǎng)絡(luò)爬蟲(chóng)也叫網(wǎng)絡(luò)蜘蛛,是一種自動(dòng)化瀏覽網(wǎng)絡(luò)的程序,或者說(shuō)是一種網(wǎng)絡(luò)機(jī)器人。 什么是爬蟲(chóng) 網(wǎng)絡(luò)爬蟲(chóng)也叫網(wǎng)絡(luò)蜘蛛,是一種自動(dòng)化瀏覽網(wǎng)絡(luò)的程序,或者說(shuō)是一種網(wǎng)絡(luò)機(jī)器人。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類(lèi)似網(wǎng)站,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。它們可以自動(dòng)采集所有其能夠訪問(wèn)到的頁(yè)面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁(yè)面),而使得用戶能更快的檢索到他們需要的信息。簡(jiǎn)...
摘要:下載器下載器負(fù)責(zé)獲取頁(yè)面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁(yè)面下載完畢,下載器生成一個(gè)該頁(yè)面的,并將其通過(guò)下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號(hào):Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲(chóng)的路上,學(xué)習(xí)scrapy是一個(gè)必不可少的環(huán)節(jié)。也許有好多朋友此時(shí)此刻也正在接觸并學(xué)習(xí)sc...
摘要:在近幾年迅速咋程序界掀起了不小的波瀾,而關(guān)于的第三庫(kù)也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用做一個(gè)網(wǎng)絡(luò)爬蟲(chóng)來(lái)抓取一些頁(yè)面信息。 Python在近幾年迅速咋程序界掀起了不小的波瀾,而關(guān)于python的第三庫(kù)也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用python做一個(gè)網(wǎng)絡(luò)爬蟲(chóng)來(lái)抓取一些頁(yè)面信息。今天我們使用的庫(kù)(包含python自身攜帶的庫(kù)和第三庫(kù)) ...
摘要:在近幾年迅速咋程序界掀起了不小的波瀾,而關(guān)于的第三庫(kù)也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用做一個(gè)網(wǎng)絡(luò)爬蟲(chóng)來(lái)抓取一些頁(yè)面信息。 Python在近幾年迅速咋程序界掀起了不小的波瀾,而關(guān)于python的第三庫(kù)也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用python做一個(gè)網(wǎng)絡(luò)爬蟲(chóng)來(lái)抓取一些頁(yè)面信息。今天我們使用的庫(kù)(包含python自身攜帶的庫(kù)和第三庫(kù)) ...
閱讀 1308·2023-04-26 01:03
閱讀 1941·2021-11-23 09:51
閱讀 3310·2021-11-22 15:24
閱讀 2672·2021-09-22 15:18
閱讀 1017·2019-08-30 15:55
閱讀 3486·2019-08-30 15:54
閱讀 2256·2019-08-30 15:53
閱讀 2397·2019-08-30 15:44