python3 多執行緒爬蟲
多執行緒爬蟲涉及到佇列queue,多執行緒threading,模組,由於多執行緒模組我再前面提過,這兒簡單提一下queue模組的簡單功能。
import queue
myqueue = queue.Queue(maxsize = 10)
queue.Queue類即是一個佇列的同步實現。佇列長度可為無限或者有限。可通過Queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。
將一個值放入佇列中
myqueue.put(10)
呼叫佇列物件的put()方法在隊尾插入一個專案。put()有兩個引數,第一個item為必需的,為插入專案的值;第二個block為可選引數,預設為1。如果隊列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。
將一個值從佇列中取出
myqueue.get()
呼叫佇列物件的get()方法從隊頭刪除並返回一個專案。可選引數為block,預設為True。如果佇列為空且block為True,get()就使呼叫執行緒暫停,直至有專案可用。如果佇列為空且block為False,佇列將引發Empty異常。
queue.Queue.qsize()
返回佇列的大小
queue.Queue.empty()
如果佇列為空,返回True,反之False
queue.Queue.full()
如果佇列滿了,返回True,反之False
queue.Queue.full
與 maxsize 大小對應
queue.Queue.get([block[,
timeout]])獲取佇列,timeout等待時間
queue.Queue.get_nowait()
相當queue.Queue.get(False)
非阻塞
queue.Queue.put(item) 寫入佇列,timeout等待時間
queue.Queue.put_nowait(item)
相當queue.Queue.put(item, False)
queue.Queue.task_done()
在完成一項工作之後,queue.Queue.task_done()函式向任務已經完成的佇列傳送一個訊號
queue.Queue.join()
實際上意味著等到佇列為空,再執行別的操作
乾貨:
有了基礎知識,則可以進行多執行緒爬蟲了,好的學習資料有:各種爬蟲http://www.pythonclub.org/python-network-application/observer-spiderfrom threading import Thread from queue import Queue from time import sleep #q是任務佇列 #NUM是併發執行緒總數 #JOBS是有多少任務 q = Queue() NUM = 4 JOBS = 16 #具體的處理函式,負責處理單個任務 def do_somthing_using(arguments): print(arguments) #這個是工作程序,負責不斷從佇列取資料並處理 def working(): while True: arguments = q.get() #預設佇列為空時,執行緒暫停 do_somthing_using(arguments) sleep(1) q.task_done() #開啟執行緒 threads = [] for i in range(NUM): t = Thread(target=working)#執行緒的執行函式為working threads.append(t) for item in threads: item.setDaemon(True) item.start() #JOBS入隊 for i in range(JOBS): q.put(i) #等待所有佇列為空、再執行別的語句 q.join()
# coding =utf-8
import queue
import os
import urllib.request as request
import re
import threading
#建立佇列
all_net = queue.Queue()
count = 0
threads = []
myLock = threading.RLock()
#定義抓取網頁並且存入all_net中的函式,定義停止條件,防止無限迴圈抓取。
def obtain_net(url):
#路徑設定
global count
path = 'D:\\test\\2'
if not os.path.isdir(path):
os.makedirs(path)
#讀取URL資料
urlData = request.urlopen(url).read()
data = urlData.decode('GBK')
#爬取當前的網頁
myLock.acquire() #修改共享資料count的鎖
net_path = path +'\\' + '{}.html'.format(count)
print(count)
count +=1
with open(net_path,'wb') as file:
file.write(urlData) #次數要解碼前的資料,不然型別不匹配,所以不能用data
file.close()
myLock.release() #解開鎖
#匹配當前網頁裡面的網頁連結,存在佇列裡
link_object = re.compile(r'<a href="(http://.+?)" ')
for item in link_object.findall(data):
all_net.put(item) #把網址存在佇列中
def thread(number):
global count
while count<5: #執行緒迴圈
print('aaaaa: {}'.format(count))
if all_net.qsize() >= number:
for i in range(number):
t = threading.Thread(target=obtain_net,args=(all_net.get(),))
t.setDaemon(True)
t.start()
# threads.append(t)
#for item in threads:
# item.setDaemon(True)
# item.start()
# item.join() #等待執行緒終止
def main():
URL = r'http://www.taobao.com/'
obtain_net(URL) #第一次先獲取URL
number = 3
thread(number)
if __name__ == "__main__":
main()
代理訪問網頁:http://blog.csdn.net/vah101/article/details/6279423和http://wenku.baidu.com/view/4c30a74fff00bed5b8f31d45.htmlhttp://mayulin.blog.51cto.com/1628315/543559/
import urllib.request as request
proxy_handler = request.ProxyHandler({'http':'user:[email protected]:3128'})
proxy_auth_handler = request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm','www.baidu.com','user','passwd')
opener = request.build_opener(proxy_handler,proxy_auth_handler)
f = opener.open('http://www.baidu.com/')
a = f.read()
模擬百度登陸:
#-*-coding:utf-8-*-
'''
Created on 2014年1月10日
@author: hhdys
'''
import urllib.request,http.cookiejar,re
class Baidu:
def login(self):
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')]
resp=opener.open('http://weigou.baidu.com/')
for c in cj:
print(c.name,"====",c.value)
getapiUrl = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true"
resp2=opener.open(getapiUrl)
getapiRespHtml = resp2.read().decode("utf-8")
foundTokenVal = re.search("bdPass\.api\.params\.login_token='(?P<tokenVal>\w+)';", getapiRespHtml)
if foundTokenVal :
tokenVal = foundTokenVal.group("tokenVal")
print(tokenVal)
staticpage = "http://zhixin.baidu.com/Jump/index?module=onesite"
baiduMainLoginUrl = "https://passport.baidu.com/v2/api/?login"
postDict = {
'charset':"utf-8",
'token':tokenVal,
'isPhone':"false",
'index':"0",
'staticpage': staticpage,
'loginType': "1",
'tpl': "mn",
'callback': "parent.bd__pcbs__n1a3bg",
'username':"*****", #使用者名稱
'password':"*****", #密碼
'mem_pass':"on",
"apiver":"v3",
"logintype":"basicLogin"
}
postData = urllib.parse.urlencode(postDict);
postData = postData.encode('utf-8')
resp3=opener.open(baiduMainLoginUrl,data=postData)
for c in cj:
print(c.name,"="*6,c.value)
if __name__=="__main__":
print("="*10,"開始")
bd=Baidu()
bd.login()
相關推薦
python3多執行緒爬蟲爬取某美女圖片網站的指定頁圖片資源,你懂的
Queue(佇列物件) queue是python3中的標準庫,可以直接import queue引用;佇列是執行緒間最常用的交換資料的形式。 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not
python3 多執行緒爬蟲
多執行緒爬蟲涉及到佇列queue,多執行緒threading,模組,由於多執行緒模組我再前面提過,這兒簡單提一下queue模組的簡單功能。 import queuemyqueue = queue.Queue(maxsize = 10)queue.Queue類即是
【Python3.6爬蟲學習記錄】(十四)多執行緒爬蟲模板總結
前言:這幾天忙活的做個網頁玩玩,網上也沒有教程。買個域名又得解析,又得備案,真是麻煩,覺得一個簡單的HTML網頁應該用不到那麼麻煩吧。 昨天又看了幾個關於多執行緒爬蟲的例子,覺得很好,提煉出來,總結幾
非結構化資料與結構化資料提取---多執行緒爬蟲案例
多執行緒糗事百科案例 案例要求參考上一個糗事百科單程序案例 Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列是執行緒間最常用的交換資料的形式 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,
python3 多執行緒程式設計
內容借鑑: https://www.cnblogs.com/z-joshua/p/6409362.html https://www.cnblogs.com/hoobey/p/6915638.html 執行緒的掛起與阻塞的: 掛起:一般是主動的,由系統或程式發出,甚至
java多執行緒爬蟲框架crawler4j的使用
一開始找jar包找了好久都沒找到,後來花了6個積分把所有的依賴包找到了,現在放在百度雲供大家免費下載: 連結:https://pan.baidu.com/s/12MTMy4d4e6hZsmWAdXbUMQ 提取碼:433g 注意這些依賴包是3.5版本的不是最新版本。 如果想使用最新版本的
python3多執行緒和GIL全域性直譯器所
GIL的全稱是:Global Interpreter Lock,意思就是全域性直譯器鎖,這個GIL並不是python的特性,他是隻在Cpython直譯器裡引入的一個概念,而在其他的語言編寫的直譯器裡就沒有這個GIL例如:Jython,Pypy 為什麼會有gil?:
十分鐘帶你瞭解 Python3 多執行緒核心知識
每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。 每個執行緒都有他自己的一組CPU暫存器,稱為執行緒的上下文,該上下文反映了執行緒上次執行該執行緒的CPU暫存器的狀態。 指令指標和堆疊指
Python3多執行緒
寫一個多執行緒爬蟲的時候,報錯。 後來發現: url_manage_proc = Process(spider.url_manage_proc, args=(urls,)) download_html_proc = Process(spider.download_html_proc)
百度百科多執行緒爬蟲(Java)
BaiduBaikeSpider 百度百科多執行緒爬蟲Java原始碼,資料儲存採用了Oracle11g 簡介 採用了MyEclipes作為整合開發環境,應該是相容eclips 使用方法 下載此原始碼之後使用 (匯入 或者 import)操作匯入此專案 各個類介紹
Python多執行緒爬蟲學習
此程式碼包含以下學習內容: 程式封裝 網頁獲取與解析 retry裝飾器與thread多執行緒 Anime code # -*- coding: utf-8 -*- import requests import demjson from retry imp
[原創]一款小巧、靈活的Java多執行緒爬蟲框架(AiPa)
1.作品簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB的jar包。 下載該Jar包匯入到你的專案中
python多執行緒爬蟲時,主執行緒一直等待錯誤。
1、抓取網站的專輯資訊時,遇到了加上守護執行緒 ,程式執行完主執行緒,唰的一下就結束了,子執行緒在哪裡?嗯,丟掉了 t.setDaemon(True) #設定守護執行緒 把上邊那句註釋掉後,子執行緒…….emmmmm….. 執行了,然後就一直在等待………………………等一個不知道是
python3 多執行緒爬去mzitu圖片
今天學習了利用多執行緒爬妹子圖網站的圖集,最後實現功能:給定頁碼爬取當前頁碼全部圖片,並按照圖集名稱命名圖集資料夾;利用多執行緒技術,大大加快爬蟲速度。 地址如下: 詳細解析爬蟲思路: 一、需要用到的
AiPa — 小巧、靈活的 Java 多執行緒爬蟲框架
1.框架簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB
python3 多執行緒 (threading) + 鎖 (Lock) + 控制執行緒數量 (Semaphore) 的例項
學習記錄:python3 多執行緒 (threading ) + 鎖 (Lock) + 控制執行緒數量 (Semaphore) 的例項 import threading import time def sub(num): global count
Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多執行緒爬蟲爬取糗事百科
本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單執行緒爬蟲和多執行緒爬蟲的爬取效率。 什麼是
多執行緒爬蟲案例
Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列是執行緒間最常用的交換資料的形式 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not thread sa
python多執行緒爬蟲+批量下載鬥圖啦圖片專案(關注、持續更新)
python多執行緒爬蟲專案() 爬取目標:鬥圖啦(起始url:http://www.doutula.com/photo/list/?page=1) 爬取內容:鬥圖啦全網圖片 使用工具:requests庫實現傳送請求、獲取響應。 xpath實現資料解析、提取和清洗 thr
python爬蟲入門(四)利用多執行緒爬蟲
#!/usr/bin/env python # -*- coding:utf-8 -*- # 使用了執行緒庫 import threading # 佇列 from Queue import Queue # 解析庫 from lxml import etree # 請求處理 impor