1. 程式人生 > >小爬蟲程序協程版

小爬蟲程序協程版

write 提升 con AD pic exceptio 代碼 www. ==

import gevent
from gevent import monkey
import requests,time,re,os
"""

協程爬蟲的意義在於解決堵塞的耗時操作,epoll機制
不過用gevent好像不錯,先來看下gevent的概念
其原理是當一個greenlet遇到IO(指的是input output 輸入輸出,比如網絡、文件操作等)操作時,比如訪問網絡,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。
協程的意義就是跳過一些耗時操作,提升整體效率把,好像還挺有用的。
但是這個執行會容易引起訪問間隔時間過短,而造成訪問量大被封ip
"""

package_list = []
package_list2 = []
# 1.每頁的url從1-531,使用for循環 拼接url
# 2.打開url之後,使用正則findall抓取該頁的具體包鏈接 ,存入package_list


def get_pic_url(page,list):
try:
os.mkdir(str(page))
except Exception as e:
pass
head = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36‘}
url = ‘http://www.doutula.com/article/list/?page={}‘.format(page)
res = requests.get(url,headers = head)
tmp = re.findall(r‘<a href="([^#].*?)" class=".*?">‘, res.text)
print(tmp)
list.extend(tmp)
# 3.使用for循環遍歷package_list 作為picture_url
# 4.打開改url ,然後抓取url中的表情jpg,存入本地文件夾或者數據庫
for pic_url in list:
if len(pic_url) != len(‘http://www.doutula.com/article/detail/1070805‘):
break
else:
res_pic = requests.get(pic_url,headers = head)
reg = r‘‘‘<img src="(.*?)" alt="(.*?)" .*?>‘‘‘
reg = re.compile(reg,re.S)
tmp = re.findall(reg,res_pic.text)

print(tmp)

for i in tmp:
num = tmp.index(i)
picture_res = requests.get(i[0],headers = head)
string = ‘‘
if picture_res:
tmp_str = i[1]
for each in tmp_str:
if each in (‘\\‘,‘/‘,‘*‘,‘?‘,‘"‘,‘|‘,‘>‘,‘<‘):
pass
else:
string = string + each
tmp_str = string
if tmp_str[-3:] == ‘jpg‘:
with open(r‘./{}/{}-{}{}.jpg‘.format(page,list.index(pic_url),num,tmp_str),‘wb‘) as f:
f.write(picture_res.content)
time.sleep(1)
else:
with open(r‘./{}/{}-{}{}.gif‘.format(page,list.index(pic_url),num,tmp_str),‘wb‘) as f:
f.write(picture_res.content)
time.sleep(1)
else:
break
list.clear()


def fun1():
for page in range(1,265): # 一共532
get_pic_url(page,package_list)


def fun2():
for page in range(265,532): # 一共532
get_pic_url(page,package_list2)

monkey.patch_all() # 將程序中用到的耗時操作的代碼,換為gevent中自己實現的模塊

gevent.joinall([
gevent.spawn(fun1),
gevent.spawn(fun2)
])

小爬蟲程序協程版