剛剛學(xué)習(xí)多線程的時候感覺挺復(fù)雜的烈涮,但是任何事物的學(xué)習(xí)都是由簡入深朴肺,參考廖雪峰大大的文檔,大致了解了線程坚洽,然后看過一些實戰(zhàn)項目戈稿,先寫的是簡單的多線程爬蟲。
本次主要拿我第一次學(xué)python爬蟲時的項目來實踐讶舰。即爬取百度頭像吧鞍盗。
主線程爬取圖片地址,工作線程則負責(zé)下載頭像跳昼。
import time, threading
from lxml import etree
import requests
import re
import queue
#正則主要用于匹配圖片
def zhengze(patt,htm):
hh=re.compile(patt)
ll=re.findall(hh,htm)
return ll
#初始鏈接是頭像吧首頁般甲,之后是爬取各個帖子
def get_url():
url=r'http://tieba.baidu.com/f?ie=utf-8&kw=%E5%A4%B4%E5%83%8F&fr=search'
html=requests.get(url).content.decode('utf-8')
select=etree.HTML(html)
xp='//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a/@href'
url_list=select.xpath(xp)
#print(url_list)
url_list=map(lambda x:'http://tieba.baidu.com'+x,url_list)
return list(url_list)
#解析網(wǎng)頁,提取圖片地址放入隊列中
def get_down():
#lock = threading.Lock()
global que
url_list=get_url()
print ('start crawl')
for url in url_list:
html=requests.get(url).content.decode('utf-8')
patt='src="(http://imgsrc.baidu.com.+?.jpg)"'
down_list=zhengze(patt,html)
if down_list!=[]:
for e in down_list:
que.put(e)
def down_load(url,name):
jpg=requests.get(url).content
path=r'G:\p\threading_test\img4\\'+name
open(path, 'wb').write(jpg)
print (path)
#工作線程的下載函數(shù)鹅颊,由于是下載敷存,各變量不沖突,不存在線程鎖的問題
def run_down():
global que
while True:
if not que.empty():
i=que.get()
name=i[-10:]
down_load(i,name)
else:
print ('end')
break
if __name__ == '__main__':
que=queue.Queue()
quequ=get_url()
t1 = threading.Thread(target=get_down)
t1.start()
time.sleep(8)
print('start down_load')
for i in range(3):
t2 = threading.Thread(target=run_down)
t2.start()