def producer():
# 数据范围0 ~ 999
for i in range(1000):
yield i
def counsumer(gen):
for i in range(10):
print(next(gen))
初始化生成器函数
gen = producer()
counsumer(gen)
counsumer(gen)
counsumer(gen)
协程的例子(利用协程爬取数据)
"""requests 抓取页面数据模块"""
HTTP 状态码 ==>超文本传输协议(不单单可以传文件,可以传音频,视频,图片)
#一个客户端向另外一个服务端访问.一定会经过三次握手的
服务端返回的状态码:
200 ok ==>请求成功
404 not found ==>网页走丢了(访问到了,地址可以,页面没有)
400 bad request ==>失败的请求(访问不到了)
基本语法
爬取数据:
第一步:
要抓取哪一个网站
response = requests.get("http://www.baidu.com") ==>必须协议加域名
#response 响应(是一个对象)
print(response)
第二步:
获取状态码 ==>一定要检验是否能够抓取对方的页面内容
print( response.status_code )
第三步:
获取当前网页中的字符编码(对方使用什么编码集)
res = response.apparent_encoding
print( res )
第四步:
设置编码集,防止乱码
response.encoding = res ==>将自己的编码集也设置成对方的编码集
第五步;
获取网页当中的内容
res = response.text
print(res)
#如果没有直接获取到内容,先新建文件(文件名加html),在pycharm中打开,直接复制结果到pycharm中,然后将文件拖到浏览网页即可
如果爬的网站比较多,可以塞到一个列表里:
url_list = [
"http://www.baidu.com",
"http://www.4399.com/",
"http://www.7k7k.com/",
"http://www.jingdong.com/"
]
正常爬取:
import requests
def get_url(url):
response = requests.get(url)
if response.status_code == 200:
print(response.text)
for i in url_list:
get_url(i)
爬完以后扣取网站,用正则匹配:
import re
strvar = '<img lz_src="http://i5.7k7kimg.cn/cms/cms10/20200609/113159_2868.jpg"'
obj = re.search(r'<img lz_src="(.*?)"',strvar)
print(obj.groups()[0])
用协程的方式爬取数据(更多网站,大数据)★★★★★
from gevent import monkey ; monkey.patch_all()
import gevent
import requests
如果爬的网站比较多,可以塞到一个列表里:
url_list = [
"http://www.baidu.com",
"http://www.4399.com/",
"http://www.7k7k.com/",
"http://www.jingdong.com/"
.....
]
def get_url(url): 爬取函数
response = requests.get(url)
if response.status_code == 200:
print(response.text)
for i in url_list: ==>遍历爬取对象
lst = []
g = gevent.spawn(get_url,i) ==>利用多协程执行
lst.append(g) ===>如果爬取的比较多,要塞到列表里面
gevent.joinall(lst) ===>joinall正好需要的是列表,如果有多个参数,要用列表括起来
print("执行时间:" ,endtime - starttime ) # 执行时间: 2.3307271003723145
利用好多进程,多线程,多协程可以让服务期运行速度更快,
并且也可以抗住更多用户的访问;