1.什么是代理?代理和爬虫之间的关联是什么?

2.在requests的get和post方法常用的参数有哪些?分别有什么作用?(四个参数)
- url headers parmas/data proxies
3.在爬虫中如何处理cookie相关的操作?(两种方式)
- 手动
- 自动
4.什么是动态请求参数?通常情况下如何捕获动态请求参数呢?
- 每次请求都会发生变化的请求参数
- 通常情况下会被隐藏在前台页面
5.代理中的匿名度都有哪些?分别表示什么意思 6.什么是代理的类型?不同类型代理的区别是什么?
- http
- https
7.简述线程池中map方法的使用方式和其作用
func_return = map(func,list) 单线程+多任务异步协程 v3.6
- 意义:提升爬取数据的效率
- 实现异步爬虫的方式
- 多线程/多进程(不建议)
- 池(适当)
- 单线程+多任务异步协程(推荐)
- 概念
- 协程:协程对象。可以使用async关键字修饰一个函数的定义(特殊的函数),当该特殊的函数被调用后,就可以返回一个协程对象。当函数调用后,函数内部的实现语句不会被立即执行。
- 协程 == 特殊函数
- 任务对象:
- 本质上就是对协程对象进一步封装。
- 任务对象 == 特殊函数
- 给任务对象绑定一个回调
- add_done_callback(callback) - 事件循环(EventLoop):无限的循环对象
- 我们必须将任务对象注册到事件循环对象中,然后开启事件循环对象。
- 事件循环对象在执行任务对象的时候是基于异步 - await async - 注意事项:
- 保证特殊函数内部不可以出现不支持异步模块对应的代码
- 在特殊函数内部遇到阻塞操作必须使用await关键字对其进行手动挂起
- 如果想要将多个任务对象注册到事件循环中,必须将多个任务对象封装到一个列表中,然后将列表注册(必须使用wait方法将列表中的任务对象进行挂起)到事件循环中 - aiohttp模块:是一个支持异步的网络请求模块
- pip install aiohttp selenium模块的使用
- 概念:就是一个基于浏览器自动化的模块。
- selenium和爬虫之间的关联
- 很便捷的捕获动态加载的数据 - 可见即可得
- 实现模拟登陆
- 使用
- 环境的安装:
- pip install selenium
- 下载一个浏览器的驱动程序
- 谷歌驱动下载:http://chromedriver.storage.googleapis.com/index.html
- 驱动程序和浏览器版本的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672
- 创建某一款一个浏览器对象 - 动作链
- 如果想要触发一系列连续的行为动作

   

- selenium
- 和爬虫之间的关联
- 爬取动态加载的数据(可见及可得)
- 模拟登陆

-

无头浏览器
- phantomJs:无可视化界面的浏览器

- 谷歌无头浏览器:
from selenium.webdriver.chrome.options import Options。
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)

- 规避监测
- 相关的网站会对selenium发起的请求进行监测
- 网站后台可以根据window.navigator.webdriver返回值进行selenium的监测
- undefinded:不是selenium进行的请求发送
- true:是selenium发起的请求

- 规避监测的方法:
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
bro = webdriver.Chrome(executable_path='chromedriver.exe',options=option)


协程 :
  导入 asyncio 包
步骤:1.创建一个协程对象。
      2.根据协程对象封装了一个/一组(用列表表示)任务对象。
      3.事件循环:创建一个事件循环对象, 将任务注册该对象中并且启动时间循环。
4.定义一个任务对象的回调函数。(add_done_callback(callback))
        5.注意事项:在特殊函数内部不可以出现不支持异步模块相关的代码。(例:time,request)
         6.- await async
          7.aiohttp模块 :是一个支持一步的网络请求模块。
- 注意事项:
- 保证特殊函数内部不可以出现不支持异步模块对应的代码
- 在特殊函数内部遇到阻塞操作必须使用await关键字对其进行手动挂起
- 如果想要将多个任务对象注册到事件循环中,必须将多个任务对象封装到一个列表中,然后将列表注册
(必须使用wait方法将列表中的任务对象进行挂起)到事件循环中

定义了一个特殊的函数
#特殊:调用后会返回一个协程对象,且函数内部的实现语句不会被立即执行
#创建一个协程对象 async def test(num): print(num) c = test(10) print(c)
#单个任务协程
import asyncio
import time async def request(url):
print('正在请求:',url)
time.sleep(2)
print('请求完毕!',url) return url #定义一个任务对象的回调函数
#task参数表示的就是该函数被绑定的那个任务对象
def task_callback(task):
print('i am task_callback()')
print(task.result())
#task.result()返回的就是任务对象对应的特殊函数内部的返回值 c = request('www.xxx.com') task = asyncio.ensure_future(c)
task.add_done_callback(task_callback) loop = asyncio.get_event_loop()
loop.run_until_complete(task)

多任务协程(由于在特殊函数内部出现了不支持异步模块(time.sleep)对应的代码        利用 asyncio 模块进行替代)

import asyncio
import time
start = time.time()
#在特殊函数内部不可以出现不支持异步模块相关的代码
async def request(url):
print('正在请求:',url)
# time.sleep(2)#time模块是不支持异步
await asyncio.sleep(2) #阻塞操作必须使用await关键字进行挂起
print('请求完毕!',url) return url urls = [
'www.1.com',
'www.2.com',
'www.3.com'
]
def task_callback(task):
print(task.result()) tasks = [] #多任务列表:存放多个任务对象
for url in urls:
c = request(url)
task = asyncio.ensure_future(c)
task.add_done_callback(task_callback)
tasks.append(task) #将多个任务对象装在到一个任务列表中 loop = asyncio.get_event_loop()
#多任务注册
#wait就是将任务列表中的任务对象进行挂起
loop.run_until_complete(asyncio.wait(tasks)) print(time.time()-start)

aiohttp  (由于requests 模块不支持异步     所以  用aiohttp 模块)

import asyncio
import time
import aiohttp
start = time.time()
#细节1:在每一个with前加上async关键字
#细节2:在get方法前和response.text()前加上await关键字进行手动挂起操作
async def request(url):
async with aiohttp.ClientSession() as s:
#s.get/post和requests中的get/post用法几乎一样:url,headers,data/prames
#在s.get中如果使用代理操作:proxy="http://ip:port"
async with await s.get(url) as response:
#获取字符串形式的响应数据:response.text()
#获取byte类型的:response.read()
page_text = await response.text()
return page_text
urls = []
for i in range(500):
urls.append('http://127.0.0.1:5000/bobo')
def parse(task): #(回调函数)
page_text = task.result()
print(page_text+',请求到的数据!!!') tasks = []
for url in urls:
c = request(url)
task = asyncio.ensure_future(c) #(创建任务对象)
task.add_done_callback(parse)#(给任务绑定一个回调)
tasks.append(task) loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print(time.time()-start)

案例

import aiohttp
import asyncio
from lxml import etree all_titles = [] headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' }
async def request(url):
async with aiohttp.ClientSession() as s:
async with await s.get(url,headers=headers) as response:
page_text = await response.text()
return page_text urls = []
url = 'http://wz.sun0769.com/index.php/question/questionType?type=4&page=%d'
for page in range(100):
u_page = page * 30
new_url = format(url%u_page)
urls.append(new_url) tasks = []
def parse(task):
page_text = task.result()
page_text = page_text.encode('gb2312').decode('gbk')
tree = etree.HTML(page_text)
tr_list = tree.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
for tr in tr_list:
title = tr.xpath('./td[2]/a[2]/text()')[0]
print(title)
all_titles.append(title) for url in urls:
c = request(url)
task = asyncio.ensure_future(c)
task.add_done_callback(parse)
tasks.append(task) loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

selenium

演示

from selenium import webdriver
from time import sleep # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'chromedriver.exe')
# 用get打开百度页面
driver.get("http://www.baidu.com")
# 查找页面的“设置”选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)
# # 打开设置后找到“搜索设置”选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2) # 选中每页显示50条
m = driver.find_element_by_id('nr')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2) # 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2) # 处理弹出的警告页面 确定accept() 和 取消dismiss()
driver.switch_to_alert().accept()
sleep(2)
# 找到百度的输入框,并输入 美女
driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
driver.find_elements_by_link_text('美女_百度图片')[0].click()
sleep(3) # 关闭浏览器
driver.quit()
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='chromedriver.exe') #发起指定url的请求
bro.get('https://www.jd.com/') #在搜索框中搜索商品 #可以使用find系列的方法进行标签定位
search_input = bro.find_element_by_xpath('//*[@id="key"]')
#想搜索框中写入商品名称
search_input.send_keys('iphonex')
sleep(2)
btn = bro.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
sleep(2) #执行js让滚轮向下滑动
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
# bro.execute_script('window.scrollTo(0,-document.body.scrollHeight)') page_text = bro.page_source
with open('./jingdong.html','w',encoding='utf-8') as fp:
fp.write(page_text) print(page_text)
sleep(4) #关闭浏览器
bro.quit()

联动操作

from selenium import webdriver
from selenium.webdriver import ActionChains #动作连
from time import sleep bro = webdriver.Chrome(executable_path='chromedriver.exe')
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') #定位要拖动的标签
#定位的标签是存在于iframe的子页面中,如果直接使用find做定位,是定位不到的
# target_ele = bro.find_element_by_id('draggable') #像定位iframe中子页面中的标签必须进行如下操作
bro.switch_to.frame('iframeResult')
target_ele = bro.find_element_by_id('draggable') #基于动作连实现滑动操作
action = ActionChains(bro)
#点击且长按
action.click_and_hold(target_ele) for i in range(5):
#perform()表示立即执行动作连指定好的动作
action.move_by_offset(17,0).perform()
sleep(0.5) action.release() sleep(4) bro.quit()
from selenium import webdriver
from selenium.webdriver import ActionChains #动作连
from time import sleep bro = webdriver.Chrome(executable_path='chromedriver.exe')
bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') #定位要拖动的标签
#定位的标签是存在于iframe的子页面中,如果直接使用find做定位,是定位不到的
# target_ele = bro.find_element_by_id('draggable') #像定位iframe中子页面中的标签必须进行如下操作
bro.switch_to.frame('iframeResult')
target_ele = bro.find_element_by_id('draggable') #基于动作连实现滑动操作
action = ActionChains(bro)
#点击且长按
action.click_and_hold(target_ele) for i in range(5):
#perform()表示立即执行动作连指定好的动作
action.move_by_offset(17,0).perform()
sleep(0.5) action.release() sleep(4) bro.quit()

selenium  谷歌无头

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) bro.get('https://www.baidu.com')
sleep(3)
print(bro.page_source)
bro.save_screenshot('1.png') bro.quit()

selenium   规避检测    (检测按方法  在网页console    输入 window.navigator.webdriver)

from selenium import webdriver
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
#实现了规避监测
bro = webdriver.Chrome(executable_path='chromedriver.exe',options=option)
bro.get('https://www.taobao.com/')

无头和检测可以一起使用

selenium 爬取 案例

from selenium import webdriver
from time import sleep
from lxml import etree
def scoll():
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(1)
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(1)
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(1) bro = webdriver.Chrome(executable_path='chromedriver.exe') url = 'https://bj.58.com/changping/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d30000c-0000-1ad9-49a6-09fbce3a62cf&ClickID=1' bro.get(url) #get是一个阻塞的方法
sleep(2) scoll() #每一个页码对应的页面源码数据
page_text_list = []
#第一页的页面源码数据
page_text = bro.page_source page_text_list.append(page_text) for i in range(1,3):
scoll()
next_page_btn = bro.find_element_by_xpath('/html/body/div[5]/div[5]/div[1]/div[2]/a[6]')
next_page_btn.click()
sleep(1)
page_text = bro.page_source
page_text_list.append(page_text) for page_text in page_text_list:
tree = etree.HTML(page_text)
tree.xpath('')

爬虫之协程,selenium的更多相关文章

  1. python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用

    python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用 一丶单线程+多任务的异步协程 特殊函数 # 如果一个函数的定义被async修饰后,则该函数就是一个特殊的函数 async ...

  2. python爬虫——多线程+协程(threading+gevent)

    上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫.这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测 ...

  3. 进程and线程and协程效率对比

    1.进程与进程池的效率对比 多进程:p.start()过程中,只是向操作系统发送一个信号,至于什么时候执行,都是操作系统的事情,操作系统接收到信号时,帮该进程申请一块内存空间+拷贝父进程的地址空间 # ...

  4. 爬虫必知必会(4)_异步协程-selenium_模拟登陆

    一.单线程+多任务异步协程(推荐) 协程:对象.可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象 ...

  5. Python实现基于协程的异步爬虫

    一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python ...

  6. 【Python3爬虫】使用异步协程编写爬虫

    一.基本概念 进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.进程是操作系统动态执行的基本单元. 线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源.线程 ...

  7. Python 协程并发爬虫网页

    简单爬虫实例: 功能:通过urllib.request实现网站爬虫,捕获网站内容. from urllib import request def f(url): print("GET:%s& ...

  8. 爬虫高性能相关(协程效率最高,IO密集型)

    一背景常识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,采用串行的方式执行,只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是:串行并不意味着低 ...

  9. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...

随机推荐

  1. Visio图像应用

    图像插入: 直接搜索然后插入 CAD是工程绘图. CAD属性设置框 下面是图像编辑: 通过格式中的旋转进行调整 但是CAD格式的图没有格式 图片可以设置题注 图片层次的使用 CAD图片颜色的修改在 图 ...

  2. jsp页面获取当前系统时间

    value="<% out.print(new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(n ...

  3. beta 1/2 阶段中间产物提交入口

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...

  4. 认识Web应用框架

    Web应用框架 Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.类型可以分为基于请求(request-based)的 ...

  5. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...

  6. gulp的简介以及使用方法

    环境介绍: pro环境:生产环境,面向外部用户的环境,连接上互联网即可访问的正式环境. pre环境:灰度环境,外部用户可以访问,但是服务器配置相对低,其它和生产一样. test环境:测试环境,外部用户 ...

  7. shiro整合springmvc

    说明   代码及部分相关资料根据慕课网Mark老师的视频进行整理   其他资料: shiro官网 流程 配置 1) 配置web.xml整合shiro 把shiro整合到springMVC实质上是在we ...

  8. Markdown 复杂公式&常用符号

    公式格式 行内公式 行内公式(不会换行)使用 $ 作为起止符,例如:$a + b = c$, 效果为:\(a + b = c\) 块级公式 块级公式(单独一行)使用 $$ 作为起止符,例如:$$a + ...

  9. 《C++Primer》第五版习题答案--第三章【学习笔记】

    [C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...

  10. Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存

    本片文章续<Spring Boot 入门(九):集成Quartz定时任务>.本文主要基于redis实现了mybatis二级缓存.较redis缓存,mybaits自带缓存存在缺点(自行谷歌) ...