python爬虫企业级技术点_Python爬虫必备技术点(二)
Python爬蟲必備技術(shù)點(diǎn)【續(xù)】
一、非爬蟲框架
1.1 爬蟲的認(rèn)知
數(shù)據(jù)請求(網(wǎng)絡(luò)請求庫)
數(shù)據(jù)解析(re/xpath/bs4)
數(shù)據(jù)存儲(csv/pymysql/json??)
反反爬的策略
ip代理
ua池
cookie池: 收集手動登錄之后的響應(yīng)的Cookie信息
請求間隔(2~5秒)
驗證碼處理(打碼平臺、機(jī)器學(xué)習(xí)???)
1.2 網(wǎng)絡(luò)請求庫
urllib
request
urlopen()
urlretrieve(fullurl, filename)
Request(url, data=None, headers)
build_opener(*handlers)
HTTPHandler
HTTPCookieProcessor(http.cookiejar.CookieJar())
ProxyHandler(proxies={})
parse
quote()
urlencode()
http.client.HTTPResponse
code
getheaders()
getheader(name, default)
read() 讀取的響應(yīng)字節(jié)數(shù)據(jù)
requests (第三方)
request(method, url, params, data, json, files, headers, cookies, proxies, auth)
get(url, params, **kwargs)
post(url, data, json, **kwargs)
put(url, data, json, **kwargs)
delete(url, **kwargs)
Response
status_code
encoding
headers
content 字節(jié)數(shù)據(jù)
text 文本數(shù)據(jù)
json() json文本反序列化為Python的dict/list的對象
1.3 數(shù)據(jù)解析
re 正則表達(dá)式
xpath (pip install lxml)
lxml.etree.HTML(‘html內(nèi)容’) 返回Element對象
xpath(‘path路徑’) 返回Element或List[,…]
text 標(biāo)簽文本
get(‘標(biāo)簽屬性’)
bs4 (pip install bs4)
from bs4 import BeautifulSoup
root = BeautifulSoup(html, ‘lxml’) bs4.element.Tag
查詢元素標(biāo)簽的方法
find(‘標(biāo)簽名’, class_, id_) 查找第一個
find_all(‘標(biāo)簽名’, class_, id_, limit=N) 查找前N個
select(‘css選擇器’)
#id
.classname
標(biāo)簽名
后代標(biāo)簽
兄弟標(biāo)簽 (查找多個標(biāo)簽)
屬性標(biāo)簽
偽類
Tag屬性
string/text
get_text()
attrs: dict 標(biāo)簽中所有屬性的字典
contents 子標(biāo)簽的文本列表
descendants 子標(biāo)簽的Tag列表
1.4 多任務(wù)爬蟲
多線程
threading
Thread
queue.Queue 線程隊列
多進(jìn)程
multiprocessing
Process
Queue 進(jìn)程隊列
協(xié)程
asyncio
coroutine 協(xié)程裝飾器
get_event_loop()
wait()
sleep()
yield from
async / await
1.5 selenium框架
以driver程序驅(qū)動瀏覽器,對目標(biāo)(網(wǎng)站或網(wǎng)頁)進(jìn)行操作(請求網(wǎng)頁、提取數(shù)據(jù)、截圖、切換或關(guān)閉頁簽-window)。
chrome.get() 打開目標(biāo)(發(fā)起請求)
chrome.quit() 退出瀏覽器
chrome.close() 關(guān)閉當(dāng)前的窗口
chrome.find_element(By, value)
selenium.webdriver.common.by.By
ID
CLASS_NAME
NAME
XPATH
CSS_SELECTOR
LINK_TEXT
WebElement 查到的標(biāo)簽對象
get_attribute(‘屬性名’, default)
text 標(biāo)簽文本
click()
send_keys()
rect 當(dāng)前元素的位置(left, top, width, height)
chrome.find_elements(By, value)
execute_script()
save_screenshot(filename) 截圖
等待某一個標(biāo)簽元素出現(xiàn)
selenium.webdriver.support
ui
WebDriverWait
expected_conditions
visibility_of_all_elements_located((By, value))
ui.WebDriverWait(dirver, timeout) \
.until(expected_conditions, error_msg )
1.6 docker
容器技術(shù),將遠(yuǎn)程的docker倉庫中的鏡像下拉到本地, 再將鏡像運(yùn)行成為一個容器(進(jìn)程)。
- 鏡像操作
- 基本信息
- 名稱
- 版本
- ID
- 描述
- docker images 查看所有鏡像
- docker rmi 名稱:版本號 / ID 刪除鏡像
- docker run 名稱:版本號 / ID 啟動鏡像
- -dit 后臺啟動鏡像,啟動后可進(jìn)入容器并打開新的terminal(終端)
- -p 宿主機(jī)端口: 容器端口
- 容器操作
- docker ps 查看正運(yùn)行的容器
- -a 查看所有的容器
- -l 查看最后一個啟動的容器
- docker logs 容器名或ID? 查看容器運(yùn)行的日志
- docker exec 容器名或ID Linux命令 在容器中執(zhí)行Linux命令
- docker exec -it 容器名或ID bash 進(jìn)入容器
- docker stop 容器名或ID
- docker start 容器名或ID
- docker restart 容器名或ID
- docker rm -f 容器名或ID 刪除容器, -f強(qiáng)制刪除正運(yùn)行的容器
二、日志模塊進(jìn)階
2.1 日志格式
格式 ?? ?說明
%(name)s ?? ?記錄器的名稱, 默認(rèn)為root
%(levelno)s ?? ?數(shù)字形式的日志記錄級別
%(levelname)s ?? ?日志記錄級別的文本名稱
%(filename)s ?? ?執(zhí)行日志記錄調(diào)用的源文件的文件名稱
%(pathname)s ?? ?執(zhí)行日志記錄調(diào)用的源文件的路徑名稱
%(funcName)s ?? ?執(zhí)行日志記錄調(diào)用的函數(shù)名稱
%(module)s ?? ?執(zhí)行日志記錄調(diào)用的模塊名稱
%(lineno)s ?? ?執(zhí)行日志記錄調(diào)用的行號
%(created)s ?? ?執(zhí)行日志記錄的時間
%(asctime)s ?? ?日期和時間
%(msecs)s ?? ?毫秒部分
%(thread)d ?? ?線程ID
%(threadName)s ?? ?線程名稱
%(process)d ?? ?進(jìn)程ID
%(message)s ?? ?記錄的消息
2.2 日志模塊應(yīng)用
import logging
from logging import StreamHandler, FileHandler
四個核心部分
日志記錄器logger: 記錄日志信息
日志處理器 handler: 記錄信息之后,由handler去處理
日志過濾器 filter: 對記錄信息進(jìn)行過濾。
日志格式化 formatter: 由處理器對記錄的信息按formatter格式進(jìn)行處理(除HTTPHandler和SMTPHandler之外)。
核心方法或函數(shù)
logging.getLogger(name) # 默認(rèn)沒有name時,返回root
logging.baseConfig() 配置root記錄器的格式、處理器等。
logging.info()/debug()/warning()/error()/critical() 由root記錄器記錄日志信息。
logger記錄器的核心方法
setLevel(logging.DEBUG|INFO|WARNING|ERROR|FATAL)
addHandler(handler)
addFilter(Filter)
debug()|info()….
handler處理器的核心方法
setLevel(logging.DEBUG|INFO|WARNING|ERROR|FATAL)
setFormatter(fmt)
Formatter初始化參數(shù)
format 格式化的字符串, 使用%(日志變量)s 相關(guān)日志變量占位符組成的字符串
'hi, %(name)s, age is %(age)s' % {'age': 20, 'name': 'jack'}
'hi, %s, age is %s' % ('disen', 30)
datefmt 指定 %(asctime)s 日志時間的格式, 通常使用 %Y-%m-%d %H:%M:%S 即年月日 時分秒格式。
三、scrapy框架
3.1 scrapy架構(gòu)組成
五個核心組件
engine 引擎, 協(xié)調(diào)其它四個組件之間的聯(lián)系,即與其它四個組件進(jìn)行通信,也是scrapy框架的核心。
spider 爬蟲類, 爬蟲程序的編寫代碼所在, 也是發(fā)起請求的開始的位置。spider發(fā)起的請求,經(jīng)過engine轉(zhuǎn)入到scheduler中。
scheduler 調(diào)度器, 調(diào)度所有的請求(優(yōu)先級高,則會先執(zhí)行)。當(dāng)執(zhí)行某一個請求時,由engine轉(zhuǎn)入到downloader中。
donwloader 下載器, 實現(xiàn)請求任務(wù)的執(zhí)行,從網(wǎng)絡(luò)上請求數(shù)據(jù),將請求到的數(shù)據(jù)封裝成響應(yīng)對象,并將響應(yīng)的對象返回給engine。engine將數(shù)據(jù)響應(yīng)的數(shù)據(jù)對象(以回調(diào)接口方式)回傳給它的爬蟲類對象進(jìn)行解析。
itempipeline 數(shù)據(jù)管道, 當(dāng)spider解析完成后,將數(shù)據(jù)經(jīng)engine轉(zhuǎn)入到此(數(shù)據(jù)管道)。再根據(jù)數(shù)據(jù)類型,進(jìn)行數(shù)據(jù)處理(圖片、文本)
二個中間件
爬蟲中間件, 介于Spider和Engine之間的,可以攔截Spider的發(fā)起的請求及數(shù)據(jù)。
下載中間件,介于Engine和Downloader之間的,可以攔截下載和響應(yīng)。當(dāng)然在下載處理之前,可以設(shè)置代理 、請求頭、Cookie等操作(反反爬設(shè)置),還可以基于Splash或Selenium實現(xiàn)特定的操作。
3.2 scrapy指令
創(chuàng)建項目命令
scrapy startproject 項目名稱
創(chuàng)建爬蟲命令
scrapy genspider 爬蟲名 域名
啟動爬蟲命令
scrapy crawl 爬蟲名
調(diào)試爬蟲命令
scrapy shell url
scrapy shell
fetch(url)
view(response)
response.xpath()
3.3 Response類
屬性相關(guān)【重點(diǎn)】
body 響應(yīng)的字節(jié)數(shù)據(jù)
text 響應(yīng)的編碼之后文本數(shù)據(jù)
headers 響應(yīng)頭信息, 是字節(jié)數(shù)據(jù)
encoding 響應(yīng)數(shù)據(jù)的編碼字符集
status 響應(yīng)的狀態(tài)碼
url 請求的url
request 請求對象
meta 元數(shù)據(jù),用于request和callback回調(diào)函數(shù)之間傳值
解析相關(guān)【重點(diǎn)】
selector()
css() 樣式選擇器 , 返回Selector選擇器的可迭代(列表)對象
scrapy.selector.SelectorList 選擇器列表
x()/xpath()
scrapy.selector.Selector 選擇器
樣式選擇器提取屬性或文本
::text 提取文本
::attr(“屬性名”) 提取屬性
xpath() xpath路徑
xpath路徑,同lxml的xpath()寫法
選擇器常用方法
css()/xpath()
extract() 提取選擇中所有內(nèi)容,返回是list
extract_first()/get() 提取每個選擇器中的內(nèi)容, 返回是文本
3.4 Request類
scrapy.http.Request
請求對象的屬性
url
callback 解釋數(shù)據(jù)的回調(diào)函數(shù)對象
headers 請求頭
priority 請求的優(yōu)先級, 值越高,優(yōu)先級越高(優(yōu)先下載)
四、擴(kuò)展練習(xí)
寫出selenium向下和向右滾動的腳本
document.documentElement.scrollTop 向下
document.documentElement.scrollLeft 向右
1
2
寫出restful接口設(shè)計規(guī)范(四個)
- 每個資源都有唯一標(biāo)識 URI
- 每個資源具有四個動作, GET|POST|PUT|DELETE
- 每次請求都是無狀態(tài)
- 接口交互的數(shù)據(jù)是json或xml
寫出常見的反爬蟲和反反爬蟲
- 訪問次數(shù) - IP代理
- Cookie驗證- Cookie池
- UA驗證? - UA池
- 驗證碼 - 打碼平臺
- 動態(tài)js渲染 - Selenium/Splash
————————————————
版權(quán)聲明:本文為CSDN博主「Python-Disen」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ahhqdyh/article/details/104832423
總結(jié)
以上是生活随笔為你收集整理的python爬虫企业级技术点_Python爬虫必备技术点(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: invalidate(true) 图形不
- 下一篇: python有强大吗_python有多强