西刺网爬虫-python实践

本次引入了多进程和异常捕捉的概念,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分钟之后才可以解禁,具体的爬取规范大家可以到官网上看看。

你可能感兴趣的:(西刺网爬虫-python实践)