爬取的方法很多,,但是不管用什麼方法總結起來就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 ...