前言
上文我们定义了一个调度器,其实就是传参,具体的请查看:打造一个轻量级企业基本信息采集框架(三),本文主要对下载器做一个定义,期初想到用aiohttp做下载,后面发现aiohttp异步并发采集速度有点快,改为requests采集(主要是穷,用不起代理),当然,后面我在采集企业详细信息的时候,用了aiohttp了,其实这两者的用法都不是太难,感兴趣的去看下官方文档或者google、百度一下,立马会有很多例子出来。
我们话不多说,show your code!!!
def req_data(url,data,page,keyword,timeout=10,proxies=None):
"""
用来请求采集网址
:param data: 请求参数
:param url: url
:param page: 页数
:param keyword: 关键词
:return: html
"""
count = 1
while count < 6:
try:
req = requests.post(url+str(page),headers=get_header(),timeout=timeout,data=data)
if req.status_code in VALID_STATUS_CODE and len(req.text) > 100:
return req.text
else:
# logger.error("正在重试请求 第" + str(count) + "次" )
count += 1
time.sleep(random.randint(1,2))
except:
count += 1
time.sleep(random.randint(1,2))
else:
logger.debug("关键词为…" + keyword + " 第%s页采集失败" % str(page))
return None
简单做下说明。定义了一个req_data函数,主要传入四个参数,上面都有描述,代码部分主要是对每一个请求做5次尝试,如果返回的状态码不是200和201,且其返回值长度小于100,我们就重新尝试,如果5次还是这样,就直接返回None值,如果返回正确,将其返回到解析器去解析返回值,逻辑很简单。
下面是aiohttp请求的部分,没怎么用到,简单贴一下吧:
async def fetch(session,data,url,entername,timeout=5):
count = 1
while count < 6:
try:
async with session.post(url=url, data=data, timeout=timeout, allow_redirects=False,headers=get_headers2()) as response:
html = await response.text(errors='ignore')
await asyncio.sleep(random.randint(1,2))
if response.status in VALID_STATUS_CODE and len(html) > 100:
return html
else:
# logger.error("正在尝试重新请求" + url)
count +=1
time.sleep(1)
except:
# logger.info("正在尝试重新请求" + url)
count += 1
time.sleep(1)
else:
logger.debug("企业名称为… " + entername +"企业详细信息采集失败" )
return None
async def req_detailinfo(url,data,entername,proxy=None):
conn = aiohttp.TCPConnector(verify_ssl=False)
async with semaphore:
async with aiohttp.ClientSession(connector=conn) as session:
response = await fetch(session,data,url,entername)
return response
以上就是下载器这边的设置部分啦,是不是so easy,看起来条理清晰了很多是吧,下文我们介绍解析器这部分,这部分其实就是写写json,传传参,没有几个部分我们这个轻量级框架就要完成啦,是不是有点小激动,嘿嘿。
打造一个轻量级企业基本信息采集框架(五)