本文以一个爬虫示例,来记录python学习过程中yield的用法。
目的:爬取代理网站的IP地址、端口及地区信息,定义一个方法,该方法为一个生成器,每次调用返回列表中的不同的值(直到遍历整个列表,即每次调用返回一个不同的IP地址及端口信息)。
import requests from lxml import etree
url = 'https://www.xicidaili.com/nn' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" } response = requests.get(url=url,headers=header).text html = etree.HTML(response) ip_list = html.xpath('//div/table/tr/td[2]/text()') port_list = html.xpath('//div/table/tr/td[3]/text()') area_list = html.xpath('//div/table/tr/td[4]/a/text()') i_list = (x for x in ip_list) p_list = (y for y in port_list) a_list = (z for z in area_list) def get_proxy():
# for i in range(3): # print('-' * 10) # print('ip列表:',next(i_list)) # print('端口列表',next(p_list)) # print('地区列表',next(a_list)) # print('-' * 10) # print(i_list,p_list,a_list) new_list = [next(i_list),next(p_list),next(a_list)] # 第一次返回 # print(new_list) for count in i_list: yield new_list #当第1次程序执行到此处,直接返回'第一次返回'的列表内容 new_list = [next(i_list), next(p_list), next(a_list)] #当第2次调用,执行此处语句(从yield下面语句开始执行),重新给列表赋新值,然后走循环,再次返回列表new_list,如此循环,直至遍历i_list列表
a = get_proxy() print(next(a)) print(next(a)) print(next(a)) print(next(a)) |
执行结果如下:
['223.198.1.145', '9999', '海南'] ['222.190.163.228', '9999', '浙江金华'] ['175.42.68.32', '9999', '江苏泰州'] ['123.163.27.179', '808', '江苏宿迁市泗阳县'] |