# 中文乱码
#处理中文乱码 import requests from lxml import etree from urllib import request url = 'http://pic.netbian.com/4kqiche/' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } response = requests.get(url=url,headers=headers) #响应 #手动设置响应数据的编码 # response.encoding = 'utf-8' page_text = response.text tree = etree.HTML(page_text) #实例化 li_list = tree.xpath('//div[@class="slist"]/ul/li') for li in li_list: img_src = li.xpath('./a/img/@src')[0] img_name = li.xpath('./a/b/text()')[0] # 通用性 img_name = img_name.encode('iso-8859-1').decode('gbk') request.urlretrieve(url="http://pic.netbian.com"+img_src,filename='./图片/%s.jpg'%img_name) #相对路径 # request.urlretrieve(url="http://pic.netbian.com"+img_src,filename=r'C:\spider\day01\图片\%s.jpg'%img_name) #绝对路径 print(img_name,'0k') print('OK')
1 连接池报警 请求头改 Connection: keep-alive 为close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36 2 代理IP 在IP被封禁后 3 每次请求之间sleep进行间隔等待
模拟登陆 -- 爬取基于某些用户的用户信息
验证码识别:云打码平台 http://www.yundama.com/ 打码兔 超级鹰
使用流程:
注册
登陆:
普通用户:
查询剩余提分(充值) http://www.yundama.com/price.html
开发者用户:
创建软件:我的软件-》添加新软件(ID,秘钥)
下载示例代码:开发文档-》点此下载:云打码接口DLL-》PythonHTTP示例下载
代理:代理服务器 - 快代理 - 西祠代理 - goubanjia 匿名度: 透明:对方服务器知道你使用了代理ip也知道你的真实ip 匿名:知道你使用了代理ip但是不知道你的真实ip 高匿:什么都不知道 类型: http:只可以发起http请求 https:只可以发起https的请求
# 代理池
import requests url = 'http://www.baidu.com/s?wd=ip' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } page_text = requests.get(url=url,headers=headers,proxies={'http':'117.127.0.202:80'}).text with open('./ip.html','w',encoding='utf-8') as fp: fp.write(page_text)
# 构建代理池
http_list = [
{'http':'60.190.250.120:8080'},
{'http':'60.190.250.120:8080'},
{'http':'60.190.250.120:8080'}
]
https_list = [
{'https':'60.190.250.120:8080'},
{'https':'60.190.250.120:8080'},
{'https':'60.190.250.120:8080'}
]
# selenium 自动化
# 用来完成浏览器自动化相关的操作,可以通过代码的形式制定一些基于浏览器自动化的(行为动作),当代码执行后,浏览器就会自动触发定义的事件. - 环境安装: pip install selenium 下载对应浏览器的驱动软件 http://chromedriver.storage.googleapis.com/index.html 查看驱动和浏览器版本的映射关系: http://blog.csdn.net/huilan_same/article/details/51896672
- 编码流程:
- 导包
- 实例化某一款浏览器对象
- 制定相关行为动作
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
PhantomJS 现在停止维护更新了,不建议使用,在无界面领域,建议google的chrome无头.
https://www.cnblogs.com/bobo-zhang/p/9685362.html 更多请浏览这个link
# 简单的百度自动化处理 chromedriver.exe是个软件
from selenium import webdriver # web驱动 显式的自动化浏览器操作 from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.baidu.com') sleep(2) # 标签定位 tag_input = bro.find_element_by_id('kw') tag_input.send_keys('人民币') btn = bro.find_element_by_id('su') btn.click() sleep(2) bro.quit() # 退出
from selenium import webdriver # 显式的Js滚轮操作 from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://xueqiu.com') sleep(5) # 执行js实现滚轮向下滑动 js = "window.scrollTo(0,document.body.scrollHeight)" bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) # 加载更多的处理 a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a') a_tag.click() sleep(5) # 获取当前浏览器页面数据(动态数据) bro.page_source # 可print bro.quit() # 退出
# 一款无可视化的浏览器(免安装) 基于谷歌无头 # 谷歌无头浏览器 from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options # 创建一个参数对象,用来控制chrome以无界面模式打开 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options) bro.get('https://www.baidu.com') sleep(2) bro.save_screenshot('1.png') #拍照截屏 #标签定位 tag_input = bro.find_element_by_id('kw') tag_input.send_keys('人民币') sleep(2) btn = bro.find_element_by_id('su') # 找见 百度一下 按钮 btn.click() # 点击进行搜索 sleep(2) print(bro.page_source) # 打印页面资源 bro.quit() #退出
# 前进后退
# 模拟浏览器 前进 后退 from time import sleep from selenium import webdriver bro=webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.baidu.com') sleep(1) bro.get('https://www.taobao.com') sleep(1) bro.get('https://sogou.com') sleep(1) browser.back() #后退 sleep(1) browser.forward() #前进
print(bro.page_source) sleep(1) bro.close()
# 动作链 拖动 点击
#动作链 from selenium import webdriver from time import sleep from selenium.webdriver import ChromeOptions from selenium.webdriver import ActionChains #动作链的类 option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option) url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' bro.get(url=url) #如果定位的标签存在于iframe标签之中,则必须经过switch_to(切换参照物)操作在进行标签定位 页面加载的子页面 bro.switch_to.frame('iframeResult') # frame的id source_tag = bro.find_element_by_id('draggable') # 开始地 taget_tag = bro.find_element_by_id('droppable') # 目的地 #创建一个动作链的对象 action = ActionChains(bro) #实例化动作链对象 传入浏览器对象 action.drag_and_drop(source_tag,taget_tag) action.perform() #执行 sleep(3) # bro.quit() # 退出
# 动作链 简单版 from selenium import webdriver from time import sleep from selenium.webdriver import ActionChains bro = webdriver.Chrome(executable_path='./chromedriver.exe') url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' bro.get(url=url) #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位 bro.switch_to.frame('iframeResult') source_tag = bro.find_element_by_id('draggable') #创建一个动作连的对象 action = ActionChains(bro) action.click_and_hold(source_tag) for i in range(4): #perform表示开始执行动作链 action.move_by_offset(20,0).perform() #x,y 水平/垂直像素 sleep(1) bro.quit()
# 如何规避selenium被检测到?
正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined。 而使用selenium访问则该值为true. 只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,
它的值为['enable-automation'],完整代码如下:
from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=option)
# QQ空间的模拟登录
# 只在没有验证码情况下适用 QQ空间模拟登陆 from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') url = 'https://qzone.qq.com' bro.get(url=url) #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位 bro.switch_to.frame('login_frame') input_tag = bro.find_element_by_id('switcher_plogin').click() bro.find_element_by_id('u').send_keys('576951284') #这里填写你的QQ号 bro.find_element_by_id('p').send_keys('') #这里填写你的QQ号 bro.find_element_by_id('login_button').click() sleep(3) print(bro.page_source) bro.save_screenshot('zone.png') # 截屏 拍照 bro.quit()
# QQ空间模拟 from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') url = 'https://qzone.qq.com' bro.get(url=url) #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位 bro.switch_to.frame('login_frame') avartar_tag = bro.find_element_by_id('img_out_576951284').click() sleep(3) print(bro.page_source) bro.save_screenshot('zone.png') bro.quit()