爬蟲流程:import requests指定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 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 大家都...