基於python的爬蟲方法總結(一)

2021-09-10 06:35:09 字數 4630 閱讀 1751

爬取的方法很多,,但是不管用什麼方法總結起來就3大步

確定要爬取的url位址

向**發請求獲取相應的html頁面

提取html頁面中有用的資料

二,解析靜態頁面資料方法

三,傳送的請求型別(以requsets)

1、python2 :urllib、urllib2

2、python3 :urllib.request

對應的版本不同,python的包也不同,

以python3 為例

爬取貼吧的部分**

(這裡要注意下url中的文字要經過url編碼

方法有:

1.a=urlencode()

a=『kw=***************』

2.a=quote(『地下城』)

a=『************』 (unquote進行反url編碼)

例:

class baiduspider(object):

def __init__(self):

self.baseurl = ""

self.headers =

#獲取頁面

def getpage(self,url):

req =urllib.request.request(url,headers=self.headers)

res = urllib.request.urlopen(req)

html =res.read().decode("utf-8")

return html

#解析頁面

def parsepage(self):

pass

#儲存資料

def writepage(self,filename,html):

with open(filename,"w",encoding="utf-8") as f:

f.write(html)

如果返回的有json檔案的話 可以通過dict = json.loads(html),把返回的資料變成乙個字典,在進一步取值。

class notespider(object):

def __init__(self):

self.url =""

self.headers =

self.proxies =

def getprasepage(self):

request=requests.get(self.url,auth=self,proxies=self.proxies,headers=self.headers)

request.encoding ='utf-8'

html =request.text

p=re.compile('正規表示式',re.s)

rlist =p.findall(html)

self.writepage(rlist)

def writepage(self,rlist):

pass

爬取快**的示例:

from selenium import webdriver

import time

opt = webdriver.chromeoptions()

opt.set_headless()

driver =webdriver.chrome(options=opt)

while true:

print('頁數:',page)

driver.get(''+str(page)+'/')

time.sleep(1)

hosts=driver.find_elements_by_xpath("//td[@ data-title='ip']")

ports=driver.find_elements_by_xpath("//td[@ data-title='port']")

for host,port in zip(hosts,ports):

test_id=host.text+':'+port.text

with open('**ip.txt','a',encoding='utf-8') as f:

f.write(test_id+'\n')

page+=1

if page ==6:

break

driver.quit()

示例:

soup =beautifulsoup(html,'lxml')

rlist = soup.find_all('div',)

for r in r1list:

print(r.,div.string)

emmm,這個框架方法內容下篇再說明有點多

1.建立正則物件

2.進行匹配,返回乙個匹配的結果列表

p = re.compile('.*?title="(.*?)".*?class="content">(.*?)

',re.s)

rlist = p.findall(html)

1.建立xpath待解析物件

2.進行xpath解析,結果一定是列表

xpath的一些語法:

/:從當前節點找子結點(非後代節點),返回節點物件

例://price /book :查詢父節點為price的所有book節點,返回節點物件

// : 從整個文件中查詢節點,返回節點物件

例://price //book//name 查詢price節點的後代book節點後代的name節點,返回節點物件

contains() :匹配乙個屬性值中包含某些字串的節點

例://title[contains(@class,「e」)]查詢title節點中有class屬性,且class屬性的值中包含乙個e的節點,返回節點物件

@ : 節點中含某個屬性

例://title[@class=「en」]查詢class='en』的title節點,返回節點物件

//title/@class 查詢有class的title節點,返回class的值

//title[@class=「en」]/text()查詢class='en』的title節點,返回符合要求節點裡的所有文字。

使用方法:

parsehtml = etree.html(html)

r1 = parsehtml.xpath(』//a/@href』)

#返回單個節點物件

elmt= driver.find_element_by_name( 『text』)

elmt= driver.find_element_by_class_name( 『text』)

elmt= driver.find_element_by_id( 『text』)

text=elmt.text #獲取節點的文字內容

#返回節點列表

text = driver.find_elements_by_id( 『text』)

建立解析物件(解析方式為lxml或xml)

soup = beautifulsoup(html,『lxml』)

查詢節點物件,返回的是節點物件列表,用get_text()方法獲取文字

rlist = soup.find_all('div',)

for r in rlist:

text=r.get_text()

帶引數的請求

params=

自動拼接為url引數名=引數值&引數名=引數值

wd為引數名 flask為引數值

例: ? wd=flask

res = requests.get(url, params=params,headers=headers)

data=

#data為需要傳送的表單資料。

requests.post(url,data=data,headers=headers)

cookie請求

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

語句不變,只是headers中需要帶有cookie中的引數,一般用於登入**。

這個方法有些許中,比較簡單但很慢的是用,適用於初學者,

selenium + phantomjs/chromedriver

就加上個

執行指令碼,進度條拉到最底部

driver.execute_script(『window.scrollto(0,document.body.scrollheight)』)

還有一種就是分析每次載入的變化是哪些

通過抓包或f12看network中的變化,在伺服器傳送過來的具體檔案中找到我們需要的資料。一般是個較長的json檔案,再從檔案中分析每次載入變化的是哪些,哪些是需要的傳送給伺服器的資料,然後根據檔案請求的方式(get/post),將確認好的資料按要求新增到傳送的data中。

在框架氾濫的年**原生的已經很少了,也列舉下吧。可用訊息佇列或者管道或者共享記憶體,

基本流程是:

1.將一堆要請求的url放到urls的訊息佇列中

2.將一堆通過請求獲取到的帶解析的html放到htmls的訊息佇列中

3.建立多個執行緒進行請求url 和解析html(需解決最後解析時阻塞問題,設定超時或者其他方法即可)

4.**執行緒

基於python的爬蟲

本次初學,參考的資料見 功能主要是抓取韓寒的部落格內容,以及儲存 到 hanhan的資料夾中,執行環境實在linux下的。見 具體 如何 usr bin env python coding utf 8 import urllib import time url 60 con urllib.urlop...

基於Python的爬蟲實戰

方法 一 使用bs4包 1.獲取酷狗 內容 coding utf 8 import requests,urllib from bs4 import beautifulsoup import os result urllib.request.urlopen 2.根據html結構獲取目標標籤內容 sou...

python爬蟲總結

import requests import os def getmanypages keyword,pages params for i in range 30,30 pages 30,30 從30開始,到30 pages結束,以30為跳躍 tn resultjson com ipn rj ct ...