西刺网爬虫-python实践
2017-09-28 本文已影响66人
极致简洁
本次引入了多进程和异常捕捉的概念,python实现的并行程序有很多需要注意的地方,初学者如我也是研究了许久,才下得手。
这次的代码只是简单的应用,并行爬虫的优势大家可以自行度娘谷哥。
选取西刺网主要为后期建立代理池做个储备。
BTW,多进程下异常捕捉也是个需要我们关注的点,要好好学习钻研!
import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool,freeze_support
import traceback
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}
xiciip=['http://www.xicidaili.com/nn/{page}',
'http://www.xicidaili.com/nt/{page}',
'http://www.xicidaili.com/wn/{page}',
'http://www.xicidaili.com/wt/{page}']
def getIPList(starturl):
iplist = []
try:
for page in range(1,2):
resp = requests.get(starturl.format(page=page),headers=headers)
resp.raise_for_status()
genIPitem(resp.text,iplist)
except Exception as e:
print('erro raised',e)
traceback.print_exc()
finally:
pass
print(iplist)
def genIPitem(html,iplist):
bs = BeautifulSoup(html,'html.parser')
for line in bs.find_all('tr')[1::]:
item = {}
details = line.find_all('td')[1:6]
item['ip'] = details[0].string
item['port'] = details[1].string
item['location'] = details[2].a.string if details[2].a is not None else details[2].string.strip()
item['protocol'] = details[-1].string
item['stype'] = details[-2].string
iplist.append(item)
#单进程
#for url in xiciip:
# getIPList(url)
#以下为多进程代码
if __name__ == '__main__':
freeze_support()
pool = Pool()
pool.map(getIPList,xiciip)
pool.close()
pool.join()
print('bug completed')
西刺网爬取很简单,没啥难度。不过官方有限制,一分钟内访问次数过多会被禁止IP,得等待1分钟之后才可以解禁,具体的爬取规范大家可以到官网上看看。