chrome浏览器的安装版或绿色便携版要加.exe,chromedriver驱动无.exe。
不显示……测试软件的控制、无头同在[]内,插件等新版,无图用{};CentBrowser的Chrome内核版本低,暂用不了headless。
 
from requestium import Session,Keys
 
options={'arguments':['disable-infobars','headless'],  #'extensions':['D:/去广告 3.2.crx']
    'experimental_options':{'prefs':{'profile.managed_default_content_settings.images':2}},
    'binary_location': 'D:/Program Files/Browser/ChromeQuic/chrome.exe'}
s=Session('C:/Program Files/Python36/chromedriver','chrome',7,options)
 
#s.proxies.update({'http':f'http://{ip:port}','https':f'https://{ip:port}'})  #s.headers={'User-Agent':'…'}
#s.driver.get('about:blank')
*******************分割线*******************
提取或定位:
 
s.driver、s.get('',headers={}).json()、s.post('',data={}).content.decode(),这仨请求都有3.5个返回普通对象的提取法——任意匹配为((.|\s)*?)的re_first和re,需.extract()的css和xpath,前者返回str,后仨是list:
.re_first('\d+',default='555')、.re('')[0]、.xpath('').extract()[0]、.css('').extract_first(default='666')
 
re.findall(pattern,string,re.S)提取外()和内()的值用的是双层索引,即[num][0]和[num][1],而requestium中的re却有点特殊,外&内()的值没再套个()而是直接罗列在[ ],提取各个外()的值用[::2],内()用[1::2]。
re_first取到的是首个匹配下的外()的内容,等同re('')[0],若需要首个匹配下的内()就不能用re_first了。
 
s.driver还有.find_element_by_*的进阶版.ensure_element_by_css_selector('',state='clickable',timeout=7)等等,返回的WebElement对象,可以:
什么都不干,坐等标签加载出来;提取内容和属性如.text、.get_attribute('');
定位如.click()、.ensure_click()、.send_keys(Keys.CONTROL,'A')、.is_selected()、.is_displayed()。
state参数用默认的present通常足矣,不行还可换用clickable、visible、invisible (waiting for loading...的场景,不必等加载完)。
*******************分割线*******************
杂项:
 
s.driver.close()、.quit()、.back()、.forward()、.refresh():关闭选项卡、退出浏览器、后退前进刷新
s.driver.title、.current_url、.page_source:当前视图的标题、网址、网页源代码
s.driver.ensure_add_cookie({}型的cookies, override_domain=''):对浏览器当前访问过的各域站,都添加这个cookies。
 
s.transfer_driver_cookies_to_session(),共享了cookies、User-Agent、proxies。
反:s.transfer_session_cookies_to_driver(),requests暂只共享proxies给PhantomJS,chrome等新版。
 
binary_location中自定义的Chrome路径,Quic移动版保留了插件及插件选项设置,首次运行后还保留了session,下次运行可跳过登录等环节,直接上s.transfer_driver_cookies_to_session();而安装版就没携带插件以及保留session。不过Quic版模拟登录一些网站如百度,或许存在元素定位不准的问题。用安装版还是Quic移动版,视网站而定。
****************************************分割线****************************************
小众搜索(requests+parse,未结合selenium):
 
from pprint import pprint
from gevent import monkey;monkey.patch_all()
from gevent.pool import Pool

from requestium import Session
from fake_useragent import UserAgent
from urllib.parse import quote
 
def spider1(word):
    s=Session('','chrome')
    response=s.get(f'http://bird.so/search?q={word}')
    xsrf=response.re_first('xsrf" value="((.|\s)+?)"')
    s.headers={'referer':f'http://bird.so/search?q={quote(word)}',   #头里不能有中文
        'Cookie':f'_xsrf={xsrf}','Content-Type':'application/x-www-form-urlencoded'}
    return s,xsrf
 
def spider2(s,xsrf,word,page):
    s.headers.update({'User-Agent':UserAgent().random})
    response=s.post('http://bird.so/fuck',data=dict(_xsrf=xsrf,q=word,page=page)).json()
    with open('E:/birdSo.txt','a',encoding='utf8') as f:
        for item in response['items']:    #输出为json样式可用pprint(response)
            f.write('\n'.join([item['title'],item['formattedUrl'],item['snippet'],'\n']))
 
def main():
    s,xsrf=spider1(word)
    [p.spawn(spider2,s,xsrf,word,page) for page in range(1,7)]
    p.join()
 
if __name__ == '__main__':
    p=Pool(size=9)
    word='爬虫'
    main()
****************************************分割线****************************************
seleniumのloginedSession transfer to requests:
 
Egのoschina:
loginUrl='https://www.oschina.net/home/login'
indexUrl='https://my.oschina.net'
userName='904477955@qq.com'
pwd='123456789cy'
 
from requestium import Session,Keys
from fake_useragent import UserAgent
 
options={'arguments':['disable-infobars','headless'],  #无地址栏信息条&头,禁图,自定义路径

    'experimental_options':{'prefs':{'profile.managed_default_content_settings.images':2}},
    'binary_location': 'D:/Program Files/Browser/ChromeQuic/chrome.exe'}
s=Session('C:/Program Files/Python36/chromedriver','chrome',7,options)
driver=s.driver
 
def loginByBrowser():
    driver.get(indexUrl)  #移动版Chrome保留有session,当前访问过的域名才能删掉其cookies
    driver.delete_all_cookies()
    driver.get(loginUrl)
    css=driver.ensure_element_by_css_selector
    css('#userMail').send_keys(userName)
    css('#userPassword').send_keys(pwd,Keys.ENTER)
    css('#MySpace')
    if not driver.re_first('退出'):print('登录失败')
 
def toRequests():
    driver.get(indexUrl)    #存有众多网站的session,当前访问过的那个站点才被共享
    s.transfer_driver_cookies_to_session()    #之后默认用driver共享的UA,也可自定义
    driver.close();driver.quit()    #Quic移动版的Chrome,关闭和退出都要有
    response=s.get(indexUrl,headers={'User-Agent':UserAgent().random}).text
    if '个人资料修改' in response and '退出' in response:
        print('browser中该站点的session已共享给requests')
 
if __name__ == '__main__':
    #loginByBrowser()  #首次启用本句,Quic移动版Chrome保留了session,再运行可注释
    toRequests()
****************************************分割线****************************************
Egの百度:
Quic移动版对百度的元素定位不准,此例用不保留session的安装版CentBrowser(Chrome内核)
 
indexUrl='https://www.baidu.com/'
userName='……'
pwd='……'
 
from requestium import Session,Keys
from fake_useragent import UserAgent
 
options={'arguments':['disable-infobars'],    #登录要识别验证码,故没用无头模式也没禁图
    'binary_location':'D:/Program Files/Browser/CentBrowser/Application/chrome.exe'}
s=Session('C:/Program Files/Python36/chromedriver','chrome',7,options)
driver=s.driver
 
def loginByBrowser():
    driver.get(indexUrl)
    css=driver.ensure_element_by_css_selector
    css('#u1> a.lb').click()
    css('.tang-pass-footerBarULogin').click()
    css('[id$=userName]').send_keys(userName)
    css('[id$=password]').send_keys(pwd,Keys.ENTER)
    input('浏览器端手动输完验证码后,在本句句尾任敲一字母:')
    try:css('#TANGRAM__PSP_10__submit').click()
    except:pass
    css('.user-name')
    if not driver.re_first('退出'):print('登录失败')
 
def toRequests():
    driver.get(indexUrl)
    s.transfer_driver_cookies_to_session()
    driver.quit()
    response=s.get(indexUrl,headers={'User-Agent':UserAgent().random}).text
    if '个人中心' in response and '退出' in response:
        print('browser中该站点的session已共享给requests')
 
if __name__ == '__main__':
    loginByBrowser()
    toRequests()
****************************************分割线****************************************
requests_html库:
pip install requests-html==0.6.7,pyppeteer==0.0.10
 
from requests_html import HTMLSession
 
s=HTMLSession()
html=s.get('http://python-requests.org').html
 
links=html.absolute_links
css=html.find('#beloved-features li',first=False)[0]   #.text、.attrs、.html
html.render()   #\.pyppeteer\…\CrashpadMetrics-active.pma:WinError 5
js=html.search('Python 2 will retire in only {m} months!')['m']
print(links,css,js,sep='\n')

requestium的更多相关文章

  1. requests+selenium==requestium模块介绍

    有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...

  2. selenium===requestium模块介绍

    有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...

  3. req、js

    requests库中,可不写为headers内各键值对的部分参数:   s=requests.Session()  #或.session() s.allow_redirects=False #禁止重定 ...

  4. 自动化测试: Selenium 自动登录授权,再 Requests 请求内容

    Selenium 自动登录网站.截图及 Requests 抓取登录后的网页内容.一起了解下吧. Selenium: 支持 Web 浏览器自动化的一系列工具和库的综合项目. Requests: 唯一的一 ...

  5. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

随机推荐

  1. Linux中文乱码 - - 更改Linux字符集

     查看当前系统默认采用的字符集: # locale 在RedHat/CentOS系统下,记录系统默认使用语言的文件是/etc/sysconfig/i18n,如果默认安装的是中文的系统,i18n的内容如 ...

  2. ECMAScript 6

    参考网上其他帖子,整理如下   ES6 就是ECMAScript 6是新版本JavaScript语言的标准. 增加了如下   Promises Promises是处理异步操作的对象,使用了 Promi ...

  3. openstack swift 安装(单独对象存储服务)

    参考:https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/swift.html 安装YUM包 yum install centos-re ...

  4. spring的事务操作(重点)

    这篇文章一起来回顾复习下spring的事务操作.事务是spring的重点, 也是面试的必问知识点之一. 说来这次面试期间,也问到了我,由于平时用到的比较少,也没有关注过这一块的东西,所以回答的不是特别 ...

  5. visual studio vode 汉化

    在vs code 的商店中搜索Chinese,找到如下模块,安装. 安装后,按下ctrl+shift+p,找到configure display language ,点击进入,修改 改成如图字母就可以 ...

  6. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  7. Codeforces 1083B The Fair Nut and Strings

    Description 给定两个由 \('a'\), \('b'\) 组成的字符串 \(a\), \(b\),以及两个整数 \(n\) 和 \(k\) \(n\) 表示字符串 \(a\),\(b\) ...

  8. X of a Kind in a Deck of Cards LT914

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  9. How to get raw request body in ASP.NET?

    protected void Page_Load(object sender, EventArgs e) { MemoryStream memstream = new MemoryStream(); ...

  10. SystemUI中设置横竖屏显示

    SystemUI中快捷菜单有 “方向锁定” . RotationLockTile protected void handleClick() { if (mController == null) ret ...