前面的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp
希望你喜欢
爬取页面`https://tu.fengniao.com前面程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎选的。
“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 创新互联建站是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于做网站、成都做网站、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!
一顿熟悉的操作之后,我找到了下面的链接https://tu.fengniao.com/ajax/ajaxTuPicList.php?page=2&tagsId=15&action=getPicLists
这个链接返回的是JSON格式的数据
专业博客
ヾ(◍°∇°◍)ノ゙import aiohttp
import asyncio
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Accept": "*/*"}
async def get_source(url):
print("正在操作:{}".format(url))
conn = aiohttp.TCPConnector(verify_ssl=False) # 防止ssl报错,其中一种写法
async with aiohttp.ClientSession(connector=conn) as session: # 创建session
async with session.get(url, headers=headers, timeout=10) as response: # 获得网络请求
if response.status == 200: # 判断返回的请求码
source = await response.text() # 使用await关键字获取返回结果
print(source)
else:
print("网页访问失败")
if __name__=="__main__":
url_format = "https://tu.fengniao.com/ajax/ajaxTuPicList.php?page={}&tagsId=15&action=getPicLists"
full_urllist= [url_format.format(i) for i in range(1,21)]
event_loop = asyncio.get_event_loop() #创建事件循环
tasks = [get_source(url) for url in full_urllist]
results = event_loop.run_until_complete(asyncio.wait(tasks)) #等待任务结束
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
上述代码在执行过程中发现,顺发了20个请求,这样子很容易就被人家判定为爬虫,可能会被封IP或者账号,我们需要对并发量进行一下控制。
使Semaphore
控制同时的并发量
import aiohttp
import asyncio
# 代码在上面
sema = asyncio.Semaphore(3)
async def get_source(url):
# 代码在上面
#######################
# 为避免爬虫一次性请求次数太多,控制一下
async def x_get_source(url):
with(await sema):
await get_source(url)
if __name__=="__main__":
url_format = "https://tu.fengniao.com/ajax/ajaxTuPicList.php?page={}&tagsId=15&action=getPicLists"
full_urllist= [url_format.format(i) for i in range(1,21)]
event_loop = asyncio.get_event_loop() #创建事件循环
tasks = [x_get_source(url) for url in full_urllist]
results = event_loop.run_until_complete(asyncio.wait(tasks)) #等待任务结束
走一波代码,出现下面的结果,就可以啦!
在补充上图片下载的代码
import aiohttp
import asyncio
import json
## 蜂鸟网图片--代码去上面找
async def get_source(url):
print("正在操作:{}".format(url))
conn = aiohttp.TCPConnector(verify_ssl=False) # 防止ssl报错,其中一种写法
async with aiohttp.ClientSession(connector=conn) as session: # 创建session
async with session.get(url, headers=headers, timeout=10) as response: # 获得网络请求
if response.status == 200: # 判断返回的请求码
source = await response.text() # 使用await关键字获取返回结果
############################################################
data = json.loads(source)
photos = data["photos"]["photo"]
for p in photos:
img = p["src"].split('?')[0]
try:
async with session.get(img, headers=headers) as img_res:
imgcode = await img_res.read()
with open("photos/{}".format(img.split('/')[-1]), 'wb') as f:
f.write(imgcode)
f.close()
except Exception as e:
print(e)
############################################################
else:
print("网页访问失败")
# 为避免爬虫一次性请求次数太多,控制一下
async def x_get_source(url):
with(await sema):
await get_source(url)
if __name__=="__main__":
#### 代码去上面找
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
图片下载成功,一个小爬虫,我们又写完了,美滋滋