爬蟲之網頁資料提取

2021-10-24 07:20:33 字數 4280 閱讀 5999

爬蟲流程:

指定url

發請求收響應

解資料存資料

資料解析方法分類:

正則(各程式語言都可以用)

bs4(python獨有)

xpath(重點,各種程式語言都可用)

bs4.beautifulsoup 提供的方法和屬性:

例項化beautifulsoup的方法

本地html檔案

例 beautifulsoup(file)

通過url獲取到的html文字

例 beautifulsoup(response.text)

定位區域:

1.按標籤+屬性查詢

soup.tag_name: 返回第一次出現的tag_name對應的標籤

soup.find(tag_name, ): 返回第一次出現的tag_name對應的標籤

soup.find_all(tag_name, ): 返回所有找到的元素的列表

例 soup.find('div', ),查詢class='chapter_content'的div標籤,然後返回

2.css選擇器

soup.select

例 soup.select('.chapter_content > p'),查詢class='chapter_content'下的所有p標籤,組成列表後返回

獲取標籤之間的文字資料

1.只獲取標籤的直系結點的文字內容

tag.string

2.遞迴獲取標籤內的所有文字內容

tag.text

tag.get_text()

獲取標籤中的屬性值

soup.tag_name['attribute']

使用xpath解析資料

步驟1.例項化lxml.etree物件

2.使用etree物件的xpath方法結合xpath表示式解析資料

例項化etree物件的方法

用本地html檔案例項化

etree.parse(some_file_or_file_like_object)

用request得到的html資料例項化

etree.html(response.text)

xpath表示式的用法

指定層級: .當前節點 /根節點或單層級,//跨層級

指定屬性: tag[@attr_name="attr_value"],屬性值必須用雙引號包圍,不能用單引號

索引定位: tag[index] 索引從1開始

取文字/text() 獲取直系文字

//text() 遞迴獲取所有文字

取屬性/@attr_name

或運算子

|例如 expression1 | expression2

例 tree.xpath('.//div[@class="bottom"]/ul//li/a/text()')

爬取網頁時遇見中文亂碼問題的解決辦法:

1. 如果是requests.get()或post()等方法得到的html亂碼,則可修改response.encoding

response.encoding = 'gbk' 或 response.encoding = 'utf-8'

2. 如果想修改編碼python的str型別編碼,可使用

string.encode('iso-8859-1').decode('gbk')

import requests

import re

import os

if __name__ == '__main__':

# 建立用於儲存的資料夾

if not os.path.exists('./qiutu_libs'):

os.mkdir('./qiutu_libs')

# 1. 請求主頁

url = ''

headers =

page_text = requests.get(url=url, headers=headers).text

# 2. 使用正規表示式提取鏈結

# html原始碼片段樣例:

例2: bs4.beautifulsoup提取**正文

# 任務:使用requests+bs4.beautifulsoup 提取詩詞名句網「三國演義」的正文,儲存到"./sanguo.txt"中

import requests

from bs4 import beautifulsoup

if __name__ == '__main__':

# 1. url

url = ''

# ua偽裝

headers =

# 2. 請求主頁

page_text = requests.get(url=url, headers=headers).text

# 3. 使用css選擇器提取主頁中所有章節的li標籤

soup = beautifulsoup(page_text, 'lxml')

li_list = soup.select('.book-mulu > ul > li')

with open('./sanguo.txt', 'w', encoding='utf-8') as fp:

for li in li_list:

title = li.a.string

# 4. 獲取章節詳情頁

detail_url = '' + li.a['href']

detail_page_text = requests.get(url=detail_url, headers=headers).text

detail_soup = beautifulsoup(detail_page_text, 'lxml')

# 5. 解析章節正文內容

# 法一: css選擇器

p_list = detail_soup.select('.chapter_content > p')

print(title, ':', file=fp)

for p in p_list:

print(p.string.strip(), file=fp)

# 法二:soup.find

# div_tag = detail_soup.find('div', )

# print(div_tag.text.strip(), file=fp)

print('{} done.'.format(title))

import requests

from lxml import etree

import os

if __name__ == '__main__':

# 建立資料夾

dir_path = './beautiful_girl'

if not os.path.exists(dir_path):

os.mkdir(dir_path)

# 1. 請求主頁

url = ''

headers =

response = requests.get(url=url, headers=headers)

# 修改編碼,解決中文亂碼問題

response.encoding = 'gbk'

page_text = response.text

# 2. 獲取所有所在li標籤,形成列表

tree = etree.html(page_text)

li_list = tree.xpath('//ul[@class="clearfix"]/li')

for li in li_list:

detail_url = '' + li.xpath('.//img/@src')[0]

title = li.xpath('./a/img/@alt')[0]

# 4. 請求具體

picture = requests.get(url=detail_url, headers=headers).content # 使用二進位制

# 5. 儲存

網頁資料提取requests etree

針對網頁資料的分析提取,很多都是推薦bs4,個人比較喜歡etree,簡單方便。大致的邏輯就是先requests請求某乙個url,得到網頁的源 pages.content 然後通過etree對源 格式化,變成可解析的格式 etree.html 然後再用xpath提取你需要的內容就可以了,簡單的demo...

網頁資料抓取 爬蟲

資料抓取其實從字面意思就知道它是抓取資料的,在網際網路世界中,資料量是乙個非常大的。有時候靠人為去獲取資料這是乙個非常不明智的。尤其是你需要的資料來自很多不同的地方。網路爬蟲是是一種按照一定的規則,自動地抓取網際網路 資訊的程式或者指令碼。它主要抓取形式有兩種 1種是抓取網頁鏈結,通過url鏈結得到...

網路爬蟲之網頁資料解析(XPath)

xpath定義 xpath表示式 lxml庫 xpath案例 引入有人說,我正則用的不好,處理html文件很累,有沒有其他的方法?有!那就是xpath,我們可以先將網路獲取的string型別資料轉換成 html xml文件,然後用 xpath 查詢 html xml 節點或元素。什麼是xml 大家都...