爬虫概述
###爬虫概述
- 什么是爬虫? -就是通过编写程序,让其模拟浏览上网,然后再互联网中抓取数据的过程。
-关键词抽取: -模拟:浏览器就是一个纯天然最原始的一个爬虫工具 -抓取: -抓取一整张的页面源码数据 -抓取一整张页面中的局部数据 - 爬虫的分类: -通用爬虫:
-聚焦爬虫- 要求我们爬取一整张页面源码数据
-增量式爬虫- 要求爬取一张页面中的局部的数据 -聚焦爬虫建立再通用爬虫基础之上 z
-分布式爬虫- 用来监测网站数据更新的情况,以便爬取到网站最新更新出来的数据- 提高爬取效率的终极武器 - 反爬机制
- 是作用到门户网站中,如果网站不想让爬虫轻易取到数据,他可以制定相关的机制来阻止爬虫程序来获取数据
- 反反爬策略
- 是作用再爬虫程序中,通过策略破解反爬机制来获取数据
- 第一个反爬机制:
- robots协议
- 一个纯文本的协议,协议中规定该网站中哪些数据可以被爬,哪些不可以被爬。
- 破解:
- 你自己主观性的不遵从该协议即可
#获取豆瓣动态数据 import requests import json headers ={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41' } url = 'https://movie.douban.com/j/chart/top_list' #从抓包中得到该url params = { 'type': '5', 'interval_id': '100:90', 'start': '0', 'limit': '100', } response = requests.get(url=url,headers=headers,params =params) page_test = response.json() with open('douban.html','w',encoding='gbk') as f: for mave in page_test: f.write(mave['score']) f.write(mave['title'])
协程单线程+多任务,asyncio模块、aiohttp模块
-
-单线程+多任务异步协程
-特殊函数
- 如果一个函数的定义被async修饰后,则该函数就变成了一个特殊函数
- 特殊之处:
-该特殊函数调用后,函数内部语句不会被立刻执行
-该特殊函数被调用后会返回一个协程对象
- 协程对象
- 对象,可以通过调用特殊函数对象返回
- 任务对象
- 任务对象就是一个高级的协程对象
- 事件循环对象
- 作用:
- 可以将多个任务对象注册/装载到事件循环对象中
- 如果开启事件循环后,则其内部注册/装载的任务对象就按指定操作被基于异步执行
- 创建方式
loop = asyncio.get_event_loop()
- 开启方式
loop.run_until_complete(task)
-
- - 多任务爬虫数据解析
- 一定要使用回调函数来解析,多任务的架构中数据是封装在特殊函数中,我们要保证在数据请求结束之后再实现数据解析
-
-
import time
import aiohttp
import asyncio
from lxml import etree
urls=[1,2,3]
async def get_reqest(url):
# 实例化一个请求对象
async with aiohttp.ClienSession() as sess:
# 调用get发起请求,返回一个响应对象
#get/post(url,headers,params/data,proxy="http://ip:port")
async with await sess.get(url=url) as response:
#text()获取字符串形式的响应数据
#read()获取byte类型响应数据
page_text = await response.text()
return page_text
#回调函数
def parse(t):
page_text = t.result()
tree = etree.HTML(page_text)
parse_text = tree.xpath('//a[id="feng"]/text()')[0]
print(parse_text)
if __name__ == '__main__':
start = time.time()
tasks = []
for url in urls:
c =get_reqest(url)
task = asyncio.ensure_future(c)
#调用回调函数处理数据,传值为task返回值
task.add_done_callback(parse)
tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print(time.time()-start)
-
- 你自己主观性的不遵从该协议即可
- robots协议
浙公网安备 33010602011771号