本文目錄一覽:
- 1、python爬蟲如何定位
- 2、python爬蟲怎麼定位到這個標籤?
- 3、Python爬蟲如何寫?
- 4、python爬蟲時,bs4無法讀取網頁標籤中的文本?
- 5、python爬蟲簡單問題,HTML對象的定位問題?
python爬蟲如何定位
4種方法可以定位爬蟲位置:
1、傳統 BeautifulSoup 操作
經典的 BeautifulSoup 方法藉助 from bs4 import BeautifulSoup,然後通過 soup = BeautifulSoup(html, “lxml”) 將文本轉換為特定規範的結構,利用 find 系列方法進行解析。
2、基於 BeautifulSoup 的 CSS 選擇器
這種方法實際上就是 PyQuery 中 CSS 選擇器在其他模塊的遷移使用,用法是類似的。關於 CSS 選擇器詳細語法可以參考: 由於是基於 BeautifulSoup 所以導入的模塊以及文本結構轉換都是一致的。
3、XPath
XPath 即為 XML 路徑語言,它是一種用來確定 XML 文檔中某部分位置的計算機語言,如果使用 Chrome 瀏覽器建議安裝 XPath Helper 插件,會大大提高寫 XPath 的效率。
4、正則表達式
如果對 HTML 語言不熟悉,那麼之前的幾種解析方法都會比較吃力。這裡也提供一種萬能解析大法:正則表達式,只需要關注文本本身有什麼特殊構造文法,即可用特定規則獲取相應內容。依賴的模塊是re
希望以上回答可以幫助到你。
python爬蟲怎麼定位到這個標籤?
import requests
import re
re_text = requests.get(url).text
re_content = re.findall(‘meta name=”keywords” content=”(.*?)”/’, re_text)
print(re_content)
.*? 表示非貪婪匹配,可以匹配到。
Python爬蟲如何寫?
先檢查是否有API
API是網站官方提供的數據介面,如果通過調用API採集數據,則相當於在網站允許的範圍內採集,這樣既不會有道德法律風險,也沒有網站故意設置的障礙;不過調用API介面的訪問則處於網站的控制中,網站可以用來收費,可以用來限制訪問上限等。整體來看,如果數據採集的需求並不是很獨特,那麼有API則應優先採用調用API的方式。
數據結構分析和數據存儲
爬蟲需求要十分清晰,具體表現為需要哪些欄位,這些欄位可以是網頁上現有的,也可以是根據網頁上現有的欄位進一步計算的,這些欄位如何構建表,多張表如何連接等。值得一提的是,確定欄位環節,不要只看少量的網頁,因為單個網頁可以缺少別的同類網頁的欄位,這既有可能是由於網站的問題,也可能是用戶行為的差異,只有多觀察一些網頁才能綜合抽象出具有普適性的關鍵欄位——這並不是幾分鐘看幾個網頁就可以決定的簡單事情,如果遇上了那種臃腫、混亂的網站,可能坑非常多。
對於大規模爬蟲,除了本身要採集的數據外,其他重要的中間數據(比如頁面Id或者url)也建議存儲下來,這樣可以不必每次重新爬取id。
資料庫並沒有固定的選擇,本質仍是將Python里的數據寫到庫里,可以選擇關係型資料庫MySQL等,也可以選擇非關係型資料庫MongoDB等;對於普通的結構化數據一般存在關係型資料庫即可。sqlalchemy是一個成熟好用的資料庫連接框架,其引擎可與Pandas配套使用,把數據處理和數據存儲連接起來,一氣呵成。
數據流分析
對於要批量爬取的網頁,往上一層,看它的入口在哪裡;這個是根據採集範圍來確定入口,比如若只想爬一個地區的數據,那從該地區的主頁切入即可;但若想爬全國數據,則應更往上一層,從全國的入口切入。一般的網站網頁都以樹狀結構為主,找到切入點作為根節點一層層往裡進入即可。
值得注意的一點是,一般網站都不會直接把全量的數據做成列表給你一頁頁往下翻直到遍歷完數據,比如鏈家上面很清楚地寫著有24587套二手房,但是它只給100頁,每頁30個,如果直接這麼切入只能訪問3000個,遠遠低於真實數據量;因此先切片,再整合的數據思維可以獲得更大的數據量。顯然100頁是系統設定,只要超過300個就只顯示100頁,因此可以通過其他的篩選條件不斷細分,只到篩選結果小於等於300頁就表示該條件下沒有缺漏;最後把各種條件下的篩選結果集合在一起,就能夠儘可能地還原真實數據量。
明確了大規模爬蟲的數據流動機制,下一步就是針對單個網頁進行解析,然後把這個模式複製到整體。對於單個網頁,採用抓包工具可以查看它的請求方式,是get還是post,有沒有提交表單,欲採集的數據是寫入源代碼里還是通過AJAX調用JSON數據。
同樣的道理,不能只看一個頁面,要觀察多個頁面,因為批量爬蟲要弄清這些大量頁面url以及參數的規律,以便可以自動構造;有的網站的url以及關鍵參數是加密的,這樣就悲劇了,不能靠著明顯的邏輯直接構造,這種情況下要批量爬蟲,要麼找到它加密的js代碼,在爬蟲代碼上加入從明文到密碼的加密過程;要麼採用下文所述的模擬瀏覽器的方式。
數據採集
之前用R做爬蟲,不要笑,R的確可以做爬蟲工作;但在爬蟲方面,Python顯然優勢更明顯,受眾更廣,這得益於其成熟的爬蟲框架,以及其他的在計算機系統上更好的性能。scrapy是一個成熟的爬蟲框架,直接往裡套用就好,比較適合新手學習;requests是一個比原生的urllib包更簡潔強大的包,適合作定製化的爬蟲功能。requests主要提供一個基本訪問功能,把網頁的源代碼給download下來。一般而言,只要加上跟瀏覽器同樣的Requests Headers參數,就可以正常訪問,status_code為200,並成功得到網頁源代碼;但是也有某些反爬蟲較為嚴格的網站,這麼直接訪問會被禁止;或者說status為200也不會返回正常的網頁源碼,而是要求寫驗證碼的js腳本等。
下載到了源碼之後,如果數據就在源碼中,這種情況是最簡單的,這就表示已經成功獲取到了數據,剩下的無非就是數據提取、清洗、入庫。但若網頁上有,然而源代碼里沒有的,就表示數據寫在其他地方,一般而言是通過AJAX非同步載入JSON數據,從XHR中找即可找到;如果這樣還找不到,那就需要去解析js腳本了。
解析工具
源碼下載後,就是解析數據了,常用的有兩種方法,一種是用BeautifulSoup對樹狀HTML進行解析,另一種是通過正則表達式從文本中抽取數據。
BeautifulSoup比較簡單,支持Xpath和CSSSelector兩種途徑,而且像Chrome這類瀏覽器一般都已經把各個結點的Xpath或者CSSSelector標記好了,直接複製即可。以CSSSelector為例,可以選擇tag、id、class等多種方式進行定位選擇,如果有id建議選id,因為根據HTML語法,一個id只能綁定一個標籤。
正則表達式很強大,但構造起來有點複雜,需要專門去學習。因為下載下來的源碼格式就是字元串,所以正則表達式可以大顯身手,而且處理速度很快。
對於HTML結構固定,即同樣的欄位處tag、id和class名稱都相同,採用BeautifulSoup解析是一種簡單高效的方案,但有的網站混亂,同樣的數據在不同頁面間HTML結構不同,這種情況下BeautifulSoup就不太好使;如果數據本身格式固定,則用正則表達式更方便。比如以下的例子,這兩個都是深圳地區某個地方的經度,但一個頁面的class是long,一個頁面的class是longitude,根據class來選擇就沒辦法同時滿足2個,但只要注意到深圳地區的經度都是介於113到114之間的浮點數,就可以通過正則表達式”11[3-4].\d+”來使兩個都滿足。
數據整理
一般而言,爬下來的原始數據都不是清潔的,所以在入庫前要先整理;由於大部分都是字元串,所以主要也就是字元串的處理方式了。
字元串自帶的方法可以滿足大部分簡單的處理需求,比如strip可以去掉首尾不需要的字元或者換行符等,replace可以將指定部分替換成需要的部分,split可以在指定部分分割然後截取一部分。
如果字元串處理的需求太複雜以致常規的字元串處理方法不好解決,那就要請出正則表達式這個大殺器。
Pandas是Python中常用的數據處理模塊,雖然作為一個從R轉過來的人一直覺得這個模仿R的包實在是太難用了。Pandas不僅可以進行向量化處理、篩選、分組、計算,還能夠整合成DataFrame,將採集的數據整合成一張表,呈現最終的存儲效果。
寫入資料庫
如果只是中小規模的爬蟲,可以把最後的爬蟲結果匯合成一張表,最後導出成一張表格以便後續使用;但對於表數量多、單張表容量大的大規模爬蟲,再導出成一堆零散的表就不合適了,肯定還是要放在資料庫中,既方便存儲,也方便進一步整理。
寫入資料庫有兩種方法,一種是通過Pandas的DataFrame自帶的to_sql方法,好處是自動建表,對於對錶結構沒有嚴格要求的情況下可以採用這種方式,不過值得一提的是,如果是多行的DataFrame可以直接插入不加索引,但若只有一行就要加索引否則報錯,雖然這個認為不太合理;另一種是利用資料庫引擎來執行SQL語句,這種情況下要先自己建表,雖然多了一步,但是表結構完全是自己控制之下。Pandas與SQL都可以用來建表、整理數據,結合起來使用效率更高。
python爬蟲時,bs4無法讀取網頁標籤中的文本?
剛看了下虎撲的帖子。帖子的瀏覽量是動態載入的。並不是靜態頁面。所以常規的爬蟲爬取的內容是空的。目前我了解的有兩種方法可以去獲取瀏覽量。一種是使用selenium + chrome。模擬瀏覽器載入。這種對於動態載入的頁面比較有效。缺點就是效率太低。虎撲的帖子不建議使用(用不上)。另外一種就是找到虎撲獲取瀏覽量的請求鏈接。看截圖:
通過截圖不難發現是通過圖中的鏈接去獲取的瀏覽量。該鏈接有兩個參數。其中tid就是帖子的ID也就是每個帖子後面的ID。對比一下就發現了。最後的那個參數看起來很像是毫秒級的時間戳。在線驗證一下如下圖。
驗證結果顯示果然是時間戳(其實這個參數有沒有都無所謂)。參數弄明白了就好辦了直接將參數組合到該介面中去然後調用組合好的介面就可以了。是不是很簡單~~~
希望可以幫到你,如有問題可以繼續追問。謝謝
python爬蟲簡單問題,HTML對象的定位問題?
這裡有各種策略用於定位網頁中的元素(locate elements),你可以選擇最適合的方案,Selenium提供了一下方法來定義一個頁面中的元素:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面是查找多個元素(這些方法將返回一個列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
除了上面給出的公共方法,這裡也有兩個在頁面對象定位器有用的私有方法。這兩個私有方法是find_element和find_elements。
常用方法是通過xpath相對路徑進行定位,同時CSS也是比較好的方法。舉例:
[html] view plain copy
html
body
form id=”loginForm”
input name=”username” type=”text” /
input name=”password” type=”password” /
input name=”continue” type=”submit” value=”Login” /
input name=”continue” type=”button” value=”Clear” /
/form
/body
html
定位username元素的方法如下:
[python] view plain copy
username = driver.find_element_by_xpath(“//form[input/@name=’username’]”)
username = driver.find_element_by_xpath(“//form[@id=’loginForm’]/input[1]”)
username = driver.find_element_by_xpath(“//input[@name=’username’]”)
[1] 第一個form元素通過一個input子元素,name屬性和值為username實現
[2] 通過id=loginForm值的form元素找到第一個input子元素
[3] 屬性名為name且值為username的第一個input元素
二. 操作元素方法
在講述完定位對象(locate elements)之後我們需要對該已定位對象進行操作,通常所有的操作與頁面交互都將通過WebElement介面,常見的操作元素方法如下:
clear 清除元素的內容
send_keys 模擬按鍵輸入
click 點擊元素
submit 提交表單
舉例自動訪問FireFox瀏覽器自動登錄163郵箱。
[python] view plain copy
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# Login 163 email
driver = webdriver.Firefox()
driver.get(“”)
elem_user = driver.find_element_by_name(“username”)
elem_user.clear
elem_user.send_keys(“15201615157”)
elem_pwd = driver.find_element_by_name(“password”)
elem_pwd.clear
elem_pwd.send_keys(“******”)
elem_pwd.send_keys(Keys.RETURN)
#driver.find_element_by_id(“loginBtn”).click()
#driver.find_element_by_id(“loginBtn”).submit()
time.sleep(5)
assert “baidu” in driver.title
driver.close()
driver.quit()
首先通過name定位用戶名和密碼,再調用方法clear()清除輸入框默認內容,如「請輸入密碼」等提示,通過send_keys(“**”)輸入正確的用戶名和密碼,最後通過click()點擊登錄按鈕或send_keys(Keys.RETURN)相當於回車登錄,submit()提交表單。
PS:如果需要輸入中文,防止編碼錯誤使用send_keys(u”中文用戶名”)。
三. WebElement介面獲取值
通過WebElement介面可以獲取常用的值,這些值同樣非常重要。
size 獲取元素的尺寸
text 獲取元素的文本
get_attribute(name) 獲取屬性值
location 獲取元素坐標,先找到要獲取的元素,再調用該方法
page_source 返回頁面源碼
driver.title 返回頁面標題
current_url 獲取當前頁面的URL
is_displayed() 設置該元素是否可見
is_enabled() 判斷元素是否被使用
is_selected() 判斷元素是否被選中
tag_name 返回元素的tagName
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251743.html