【4858.com】用python写个校内网照片下载器,Scrapy登陆新版腾讯网

By admin in 4858.com on 2019年5月5日

平台:mac

一部分网页,举个例子今日头条,唯有在报到状态手艺拓展页面的访问,只怕对数码有相比复杂的注解和爱戴,直接通过网络请求进行登入并获取数据就能相比较费心。那种时候,就该本篇的支柱
selenium 上台了。

requests库登入的情势自行百度时而”python模拟登录新版和讯”,selenium也有。

人人网照片下载器
chromedriver版本对应表
chromedriver下载

网站:人人网

Selenium 是1个用以 Web
应用程序测试的工具。它的长处在于,浏览器能张开的页面,使用 selenium
就必然能取获得。但 selenium 也有其局限性,相对于脚本办法,selenium
获取内容的频率不高。

准备

  • 获得登入post数据的url
  • 获取登录所需cookie
  • 取得登录参数

1.获得登录post数据的url很轻巧,直接展开调节和测试方式在登录页面输入错误的账密,sign_in页面的request_url便是目的地方。

https://www.zhihu.com/api/v3/oauth/sign_in

二.同等输入错误的账号密码在sign_4858.com ,in页面有二个captcha?lang=en页面,同样方法获得对应url.

https://www.zhihu.com/api/v3/oauth/captcha?lang=en

3.登录参数,回到sign_in页面,chrome调节和测试重返如下:

Request URL:https://www.zhihu.com/api/v3/oauth/sign_in
Request Method:POST
Status Code:401 
Remote Address:211.159.244.190:443
Referrer Policy:no-referrer-when-downgrade
access-control-allow-credentials:true
access-control-allow-headers:
access-control-allow-methods:GET,PATCH,PUT,POST,DELETE,OPTIONS
access-control-allow-origin:https://www.zhihu.com
content-encoding:gzip
content-length:115
content-type:application/json; charset=utf-8
date:Sun, 25 Mar 2018 16:00:11 GMT
server:nginx
status:401
vary:Accept-Encoding
www-authenticate:Bearer realm="zhihu"
x-backend-server:zhihu-web.zapi-account.477c51df---10.64.194.2:31015[10.64.194.2:31015]
x-req-id:65962D55AB7C78A
x-req-ssl:proto=TLSv1.2,sni=www.zhihu.com,cipher=ECDHE-RSA-AES256-GCM-SHA384
x-za-experiment:default:None,ge3:ge3_9,ge2:ge2_1,SE_I:c,nwebQAGrowth:experiment,is_office:false,nweb_growth_people:default,info:0,is_show_unicom_free_entry:unicom_free_entry_off,biu:0,app_store_rate_dialog:close,android_profile_panel:panel_b,live_store:ls_a2_b1_c1_f2,nweb_search:nweb_search_heifetz,new_live_feed_mediacard:new,hybrid_zhmore_video:yes,new_mobile_column_appheader:new_header,enable_tts_play:post,rt:y,growth_search:s2,qrcode_login:qrcode,qaweb_related_readings_content_control:close,rows:1,biua:0,android_pass_through_push:all,new_mobile_app_header:true,enable_vote_down_reason_menu:enable,u_re:0,android_db_recommend_action:open,zcm-lighting:zcm,android_db_feed_hash_tag_style:button,mobile_feed_guide:button,is_new_noti_panel:no,wechat_share_modal:wechat_share_modal_show,nweb_search_suggest:default,growth_banner:default
x-za-response-id:7cd5b62dda1da2b9142991f2f07bee0c
:authority:www.zhihu.com
:method:POST
:path:/api/v3/oauth/sign_in
:scheme:https
accept:application/json, text/plain, */*
accept-encoding:gzip, deflate, br
accept-language:zh-CN,zh;q=0.9,en;q=0.8
authorization:oauth c3cef7c66a1843f8b3a9e6a1e3160e20
content-length:1229
content-type:multipart/form-data; boundary=----WebKitFormBoundaryNEOiAmJV7kWT8DkJ
cookie:__DAYU_PP=vIaiqBY2aV7uRIjBNZIJ56ea6e9077b8; _xsrf=7675120f-2bfa-4b1f-a708-41ed0a4cbdf4; q_c1=fc333f7760fe4a38be92609bf166d219|1521907926000|1521907926000; _zap=b531b644-4f98-435b-a879-500803fefaf1; __utma=155987696.1937086906.1521908507.1521908507.1521908507.1; __utmc=155987696; __utmz=155987696.1521908507.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); d_c0="ALCujRVJVg2PTqqMZytO05gVzbHV-etkt7g=|1521908820"; capsion_ticket="2|1:0|10:1521993599|14:capsion_ticket|44:ZTJmNmQ0YzBlYjNmNDY0Y2IyMzBmMmVjZDgyZDhhNmI=|96a1703f8665b4746725006ac4aacba50ad3d8e0c71048011700b8de14e5ec66"
origin:https://www.zhihu.com
referer:https://www.zhihu.com/signup?next=%2F
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36
x-udid:ALCujRVJVg2PTqqMZytO05gVzbHV-etkt7g=
x-xsrftoken:7675120f-2bfa-4b1f-a708-41ed0a4cbdf4
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="client_id"

c3cef7c66a1843f8b3a9e6a1e3160e20
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="grant_type"

password
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="timestamp"

1521993604811
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="source"

com.zhihu.web
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="signature"

de35ff024d7152d39503fa099180afc2720db403
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="username"

+8613250079979
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="password"

admin123
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="captcha"


------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="lang"

en
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="ref_source"

homepage
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="utm_source"


------WebKitFormBoundaryNEOiAmJV7kWT8DkJ--

十分大学一年级段,我们就算在这之中多少个参数:

  1. Response Headers里面的authorization
    2.Request Payload上边包车型大巴装有参数:

------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="client_id"

c3cef7c66a1843f8b3a9e6a1e3160e20
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="grant_type"

password
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="timestamp"

1521993604811
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="source"

com.zhihu.web
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="signature"

de35ff024d7152d39503fa099180afc2720db403
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="username"

+8613250079979
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="password"

admin123
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="captcha"


------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="lang"

en
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="ref_source"

homepage
------WebKitFormBoundaryNEOiAmJV7kWT8DkJ
Content-Disposition: form-data; name="utm_source"


------WebKitFormBoundaryNEOiAmJV7kWT8DkJ--

此处换算成键值对正是:

{
      'client_id':'c3cef7c66a1843f8b3a9e6a1e3160e20'
      'grant_type':'password'
       ......
}

在那之中,signature比较难找,在chrome里面平昔shitf+ctrl+f全局搜索’signature’,寻寻找来在1个叫
https://static.zhihu.com/heifetz/main.app.327d25e7f280cfb582a1.js
的js里面,ide展开js文件一向寻找signature,生成逻辑如下:

    function r(e, t) {
        var n = Date.now(), r = new a.a("SHA-1", "TEXT");
        return r.setHMACKey("d1b964811afb40118a12068ff74a12f4", "TEXT"), r.update(e), r.update(i.a), r.update("com.zhihu.web"), r.update(String(n)), s({
            clientId: i.a, grantType: e, timestamp: n, source: "com.zhihu.web",
            signature: r.getHMAC("HEX")
        }, t)
    }

浮动的是HMC的SHA-壹值,由grantType,clientId,”com.zhihu.web”,timestamp还有‘d一b96481一afb40118a1206八ff7肆a12f四’那几个字节生成。

对应的python代码:

client_id = 'c3cef7c66a1843f8b3a9e6a1e3160e20'
grant_type = 'password'
timestamp = str(round(time.time() * 1000))
source = 'com.zhihu.web'

def get_signature():
    hm = hmac.new(b'd1b964811afb40118a12068ff74a12f4', None, hashlib.sha1)
    hm.update(grant_type.encode())
    hm.update(client_id.encode())
    hm.update(timestamp.encode())
    hm.update(source.encode())
    return hm.hexdigest()

注意,一定是grant_type后client_id后timestamp后source,调转了出口的密文是差别的。

其他字段固定的,timestamp参照下边代码。

scrapy:

class ZhihuLoginSpider(scrapy.Spider):
    name = 'zhihu_login'
    allowed_domains = ['www.zhihu.com']
    start_urls = ['http://www.zhihu.com/']
    ##声明相应字段
    client_id = 'c3cef7c66a1843f8b3a9e6a1e3160e20'
    grant_type = 'password'
    timestamp = str(round(time.time() * 1000))
    source = 'com.zhihu.web'
    captcha = ""
    lang = 'en'
    ref_source = "homepage"
    utm_source = ""
    #注意header 要加authorization
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36",
        "authorization": f"oauth {client_id}"
    }
   #获得相应的signature
    def get_signature(self):
        hm = hmac.new(b'd1b964811afb40118a12068ff74a12f4', None, hashlib.sha1)
        hm.update(self.grant_type.encode())
        hm.update(self.client_id.encode())
        hm.update(self.source.encode())
        hm.update(self.timestamp.encode())
        return hm.hexdigest()

    def parse(self, response):
        pass
    #重写start_requests方法,要它先get https://www.zhihu.com/api/v3/oauth/captcha?lang=en拿到capsion_ticket 的cookie,不然没有这个cookie无法登陆
    def start_requests(self):
        return [scrapy.Request(url='https://www.zhihu.com/api/v3/oauth/captcha?lang=en', callback=self.call_data,
                               headers=self.header)]
   ##正式模拟登陆,post相应字段
    def call_data(self, response):
   ##该字段表明是否要填写验证码,true就是需要填写,false则不用。
        print(json.loads(response.text)["show_captcha"])
        post_data = {
            'client_id': self.client_id,
            'grant_type': self.grant_type,
            'timestamp': self.timestamp,
            'source': self.source,
            'captcha': self.captcha,
            'signature': self.get_signature(),
            'username': '填写自己的用户',
            'password': '填写自己的密码',
            'lang': self.lang,
            'ref_source': self.ref_source,
            'utm_source': self.utm_source
        }
        return scrapy.FormRequest(url='https://www.zhihu.com/api/v3/oauth/sign_in', formdata=post_data,
                                  headers=self.header, callback=self.login_callback)
   #登陆成功后直接访问知乎首页,登陆状态下有相应数据返回
    def login_callback(self, response):
        return Request(url='http://www.zhihu.com', headers=self.header, callback=self.login_callback1)
  #数据返回在这的response
    def login_callback1(self, response):
        pass

本身那边未有验证码的相干逻辑,各位看官自行完善。

下1个月,朋友圈里不亮堂怎么突然刮起了壹股晒1柒虚岁照片的风,无法免俗的本人,自然也翻箱倒柜四处找起来在此以前的肖像,由于自家存有照片的移动硬盘已经损坏,于是就回想了那时不胜火的三个社交类网址–人人网(校内网)。

目前演练爬虫登入,方法一是找页面里的js文件,通过解析js文件找到cookie新闻再保持。但现行的站点登入都有验证码,而且最烦的是request时data表单里的值基本上并没有不加密的,js学的不佳,就别想着破解了。所以想起了用的比较少的selenium模块,用于模拟登入并拿走cookie。

本篇文章简介 Selenium 下 webdriver
组件,它直接在浏览器中运作,其表现跟实际用户一样,张开浏览器、模拟输入内容、模拟点击按键等等。Selenium
测试能够在市面上主流操作平台主流浏览器上运维。

说来也巧,这天笔者登入人人网找照片时,网址也是奇慢无比,展开一张相片要花大概两秒钟,在好不轻易找到一张乐意的肖像并发完朋友圈装逼后,不由得忽然顾虑起来如若某天网址不在了,岂不是笔者有所的相片就没了,于是就准备用爬虫把相片全存到Computer上。

import time,random
from selenium import webdriver
import requests
from urllib import request
from lxml import etree

driver = webdriver.Chrome(executable_path=r'/Applications/Google Chrome.app/chromedriver')
driver.get('http://www.renren.com/PLogin.do')
time.sleep(2)
driver.find_element_by_id('email').clear()
driver.find_element_by_id('email').send_keys('myusername')  # 输入用户名
driver.find_element_by_id('password').clear()
driver.find_element_by_id('password').send_keys('mypassword')  # 输入密码

img_url = 'http://icode.renren.com/getcode.do?t=web_login&rnd='+str(random.random())
request.urlretrieve(img_url,'renren_yzm.jpg')
try:
    driver.find_element_by_id('icode').clear()
    img_res = input('输入验证码:')  # 如果需要输入验证码,可以手工,或者接口给打码平台
    driver.find_element_by_id('icode').send_keys(img_res)
except:
    pass
driver.find_element_by_id('autoLogin').click()  # 自动登陆
driver.find_element_by_id('login').click()  # 登陆
time.sleep(3)
cookie_items = driver.get_cookies()  # 获取cookie值

post = {} # 保存cookie值
for cookie in cookie_items:
    post[cookie['name']] = cookie['value']
print(post['t'])  # 人人网登陆后需要保持登陆的cookie信息
driver.quit()  # 退出selenium
# ------------------------------------------------------------

url = 'http://www.renren.com/265025131/profile'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    'Cookie':'t='+post['t'],
}
response = requests.get(url,headers=headers)
print('-'*50)

html = etree.HTML(response.text)
title = html.xpath('//title/text()')
print('目前得到的页面信息',title)
print(response.url)

1、安装

Selenium 本人的设置十二分简短 ,使用 pip install selenium
就可以,配置相应的 web 情形才是任重(Ren Zhong)而道远,Selenium 扶助主流的 IE
、Chrome、Firefox、Opera、Safari、phantomjs等浏览器。
里面 Firefox 浏览器无需别的配置可以平昔调用,但 IE 、Chrome
等浏览器需求丰硕一个 driver 文件,以最常用的 Chrome 为例:

下载
【4858.com】用python写个校内网照片下载器,Scrapy登陆新版腾讯网。chromedriver.exe
下载解压之后,将 chromedriver.exe 加多到和 python安装的根目录下,如图:

image.png

下一场就能够在本子中健康使用 selenium 调用 Chrome 了,IE 的布置格局类似。

众多同学利用 selenium
的初衷是当做爬虫使用依然对付反爬虫手段,用不着浏览器分界面,希望程序在后台运维就能够了。我们引入有如此要求的同学利用无分界面包车型客车PhantomJS 替代 Chrome 只怕 Firefox。

安装进度如下:

下载 PhantomJS

将下载实现的 phantomjs.exe 增加到 python 安装路径中的 scripts
文件夹中,如图:

image.png

紧接着,就足以健康使用了。

浅析了奴婢人网的网址,在输入用户名和密码后,利用requests库的get方法,手动增加cookies和header后,就足以很轻易的获得具有照片的url。相册音信就在Request
U哈弗L源代码里的Album List里。

小结:使用selenium模拟登入、
获取cookie没用略带时间,但想当然的以为进入renren的村办页面必须接纳获取的装有cookie值,徒浪费N三个钟头,结果只保留了cookie内的’t’值,就完成保险登录,
所以,不断的测试,是相比较首要的。

贰、基本使用办法

4858.com 1

2.启动

做到安装以及景况安排之后,就足以标准的在剧本中调用了,大家以张开百度首页为例:

from selenium import webdriver

# 调用 Chrome 浏览器
driver = webdriver.Chrome()
# 转到 百度 首页
driver.get('http://www.baidu.com')

上述正是1个最轻巧易行的开采网页的事例,当你利用 Firefox 时,调用方法:

driver = webdriver.Firefox()

使用 PhantomJS 时:

deriver = webdriver.PhantomJS()

人人网cookies

2.2 选择器

selenium 定位二个网页中的成分有无数方式,能够应用 html 标签中的
id、name、class 等性子,也能够利用 XPath 路线,乃至 js 代码。

大家依旧以百度为例,去稳固页面中的输入框以及查找开关。

率先是 F1二 运营开辟者工具,然后点击页面成分接纳开关 —>
点击需定位的因素 —> 查看定位成分的源代码

image.png

透过上海体育地方的流程,大家得以知道的阅览输入框的源代码为:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

基于源代码内容,大家得以以 id 、name、class
名等格局来定位该输入框,代码如下:

ele_input_id = driver.find_element_by_id('kw')
ele_input_name = driver.find_element_by_name('wd')
ele_input_cls = driver.find_element_by_class_name('s_ipt')

动用同1的章程,大家得以固定 百度时而 这几个寻觅按键:

开关的源代码:

<input type="submit" id="su" value="百度一下" class="bg s_btn">

定位代码如下:

ele_btn = driver.find_element_by_id('su')

上述就是轻巧的选取器知识

实质上只要就满意于保存照片的话,到此地早已没啥好写了,具体的抓取方法都大约,不论是选取scrapy框架依然轻易的用requests库,都足以参见以前的代码来写。可是,我又想把那几个下载照片的代码分享给密友使用,可总不能够让好友先看完《Python教程-廖雪峰》其后再来用吧,那可格外的不自个儿。怎么尽或许用简易的语言教会用户使用本身写的爬虫代码,就是自己面临的要紧难点了。

贰.三 基本的页面操作方法

固化到页面包车型地铁元素之后,大家会供给对该因素进行部分操作,比方输入内容、点击开关等等。
后续以百度为例,定位到输入框和查找按键之后,依次输入寻找内容并点击搜索按键。
send_keys() 函数向浏览器发送音信,click() 函数模拟点击事件。

# 输入搜索内容
ele_input_id.send_keys('Crossin的编程教室')
# 点击搜索按钮
ele_btn.click()

结果如下:

image.png

最简便易行的主意正是将代码打包成多少个exe文件,那样就只要求轻易的双击就足以施行了;可是至于网址登录,近年来还不太会管理,现在爬去供给登入的网址都以先在网址上登陆后,再手动复制cookies到代码中来达成的,那假使让另3个从未有过基础的人来弄的话,也许就要麻烦大多了。

3、Selenium 获取 cookies

在爬虫领域中,平时使用 selenium 获取 cookies 应付反爬虫。

诸如,爬取乐乎的剧情,需求登入状态,而保留的 cookies
会在自投罗网时间后失效,那时候 selenium
就派上了用处,使用预先安装的账号密码登入,然后拿走 cookies
发送给脚本使用。

百度了一番现在,所幸在1篇天涯论坛专栏里开掘了1种比较偷懒的化解登入的诀要《Python模拟登录万能法-微博|乐乎》,轻松的话就是由此python的selenium库来操作浏览器模拟手动登录网址的全经过,然后通过get_cookies()方法获得登录后的cookies,然后再将cookies传递给requests库,从而落成延续的爬取。

三.一 使用内置函数

获取 cookies 使用 get_cookies 函数,依旧以百度为例:

cookie_r = driver.get_cookies()

打印出 cookie_r 是那样的:

[{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '22584_1465_21087_18560_22581'}, {'domain': '.baidu.com', 'expiry': 3639883283.649732, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '69F8E8C5CF050F0C8CA3C358CB08BAC6:FG=1'}, {'domain': '.baidu.com', 'expiry': 3639883283.649952, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1492399635'}, {'domain': '.baidu.com', 'expiry': 3639883283.649925, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '69F8E8C5CF050F0C8CA3C358CB08BAC6'}, {'domain': 'www.baidu.com', 'expiry': 1493263637, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}, {'domain': 'www.baidu.com', 'expiry': 1492399637.649969, 'httpOnly': False, 'name': 'BD_LAST_QID', 'path': '/', 'secure': False, 'value': '18362646771513028098'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.www.baidu.com', 'expiry': 1492399642.240359, 'httpOnly': False, 'name': '__bsi', 'path': '/', 'secure': False, 'value': '16804089554912194086_00_0_I_R_3_0303_C02F_N_I_I_0'}, {'domain': 'www.baidu.com', 'expiry': 1492399647, 'httpOnly': False, 'name': 'WWW_ST', 'path': '/', 'secure': False, 'value': '1492399637585'}]

此情势的 cookies
是不能够向来传送给脚本使用的,大家需求特别的拍卖,提抽出每一种字典 name 和
value 值,将其重组在协同。

cookies_list = []
for i in cookie_r:
    cookie = i['name'] + '=' + i['value']
    cookies_list.append(cookie)
cookies_str = ';'.join(cookies_list)

由此管理的 cookies_str 就能够直接发送给 脚本使用了,打字与印刷出 cookies_str
如下:

H_PS_PSSID=22583_1433_21106_17001_20929;BAIDUID=456846B8C2CECBC077CA6A700DA24A89:FG=1;PSTM=1492400387;BIDUPSID=456846B8C2CECBC077CA6A700DA24A89;BD_HOME=0;BD_UPN=12314753;__bsi=16211205307050373314_00_0_I_R_2_0303_C02F_N_I_I_0;WWW_ST=1492400389401

4858.com 2

3.2 执行 js 函数

获得 cookies 不仅仅能够经过 get_cookies 函数,还足以一向运用 javascript
代码,示例:

# 字符串形式的 js 代码
js_code = 'return document.cookie'
# 执行 js 代码
cookies = driver.execute_script(js_code)
print(cookies)

那会儿收获的 cookies 能够直接发放脚本使用,结果如下:

BAIDUID=7ABCBA83953DC58B59943B0967D10098:FG=1; BIDUPSID=7ABCBA83953DC58B59943B0967D10098; PSTM=1492400818; BD_HOME=0; H_PS_PSSID=22584_1457_21106_17001_21673_20927; BD_UPN=12314753; __bsi=17435099398291019533_00_0_I_R_2_0303_C02F_N_I_I_0; WWW_ST=1492400820362

此地大家只简要介绍一下得到 cookies 的办法,在 selenium 中举行 javasript
代码还有越来越多更卓绝的游戏的方法,就不在这里举行讲了。

selenium示意图

4、结语

在本篇小说中,我们大致的牵线了 selenium
的设置使用进度,以操作百度首页为例,演示了怎么着定位、如何启用事件、怎样得到cookies 应对中央的反爬虫花招。

理所当然,selenium 所富含得内容远不止此,详细内容请查看官方文书档案:
http://www.seleniumhq.org/docs/


应接参加 克罗丝in的编程教室
crossincode.com新手入门
QQ群:522415386
微信请加 crossin1壹 留言入群(新手/进阶)

selenium简介

  • selenium是2个Web应用的自动化测试工具,它能够照猫画虎真实用户对浏览器的操作,帮忙种种语言,包蕴C、JAVA、Perl、Ruby、PHP以及Python等。
  • selenium支持驱动多样浏览器,包涵ie、chrome、火狐、safari、opera等。
  • Python中selenium通过find_element()的点子,对浏览器页面中的成分进行定点,其固定能够借助xpath、id、name、class、css
    selector等等形式贯彻,然后能够对固定的因素举办文本抓取以及模拟鼠标或键盘操作。selenium还足以透过其它格局,举例wait来确定保障对成分的操作能够正确实行。

Python近期能够透过pyinstaller库来促成代码打包成exe的效果,pyinstaller库使用起来相比较轻松,具体方法如下,除此以外笔者也未再多做研商。

一.在cmd命令行中输入pip install pyinstaller来安装pyinstaller库。
二.在python目录的Scripts文件夹中找到安装好的pyinstaller,用鼠标将其拖入cmd中,然后输入-F,再将python代码文件用鼠标拖到前边,Enter确认就可以。
三.若想退换Logo,在第一步中再额外输入-i,并将Logo文件.ico拖到末端。

  • cmd命令行的输入格式为:
    xxx\xxx\xxx\pyinstaller -F xxx\xxx\代码文件.py -i
    xxx\xxx\xxx\图标.ico

下边具体起首码代码。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

#selenium操作浏览器需要下载相应的驱动。
#我用的是chrome浏览器,因此需要下载相应版本的chromedriver.exe。
chromepath = r"C:\chromedriver.exe"

#现在人人网的首页有太多的图片了,为了加快载入速度添加一个浏览器设置,设置为不加载图片。
chrome_opt = webdriver.ChromeOptions()
prefs={"profile.managed_default_content_settings.images":2}
chrome_opt.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(chromepath,chrome_options=chrome_opt)
wait = WebDriverWait(browser,3)

#打开人人网主页
browser.get('http://www.renren.com/')
#定位到用户名输入框,通过send_keys的方式,输入用户名
login = wait.until(
    EC.presence_of_element_located((By.XPATH,"//input[@name='email']"))
)
login.send_keys(login_account)
#定位到密码输入框,通过send_keys的方式,输入密码
pwd = wait.until(
    EC.presence_of_element_located((By.XPATH,"//input[@id='password']"))
)
pwd.send_keys(password)
#勾选保存密码按钮
browser.find_element_by_xpath("//form[@id='loginForm']/dl[@class='savepassword clearfix']/dt/label[@class='labelCheckbox']/input[@id='autoLogin']").click()
#点击确认并登陆
browser.find_element_by_xpath("//form[@id='loginForm']/dl[@class='bottom']/input[@id='login']").click()
#不可缺少!
cookie_dic = {}
while 'ln_uact' not in cookie_dic.keys():
    cookies = browser.get_cookies()
    print('登陆Cookies获取中...')
    # 将selenium获取的cookies格式转换为requests所识别的格式
    for i in cookies:
        cookie_dic[i['name']] = i['value']
print('登陆Cookies获取完毕,准备开始抓取相片...')

登录人人网并获得cookies的代码就曾经做到了,种种部分的功用已在代码里注释了,个中值得提明的少数是最后关于cookies的一部分。作者用了while循环来决断cookies是或不是准确获取,之所以如此做是因为从点击登录按键到页面完全加载是须要肯定的时日,若在页面未完全加载的情况下获得cookies,会意识cookies中少了1部分参数,当中就包蕴了lu_act,此时到手的cookies则不可能用于登入。

  • 这里也足以省略的通过time.sleep()来安装3个等待时间,等待页面加载完结后来获取cookies,可是这么代码就不够健康,只怕遭到网络带宽因素的震慑。
  • 此外也能够经过selenium自带的来得等待WebDriverWait来促成,通过监视页面上有些成分的境况来剖断页面是不是完全加载。作者尚未运用那种办法是因为尝试着用了多少个要素作为推断依附都战败了。。

剩余的代码则是简约的用requests库开始展览爬取,方法或许对网页元素以及url进行分析,各种部分在爬虫源代码中都曾经有了详尽表明,就不再实行细说。须求表达的是,获取相片信息和下载相片要用到几个headers,因为双方的host音信不一样。

#两个headers,第一个headers带有host值,用于获取相片信息。
#第二个headers不能带有前面的host值,用于下载相片。
headers = {'Host':'photo.renren.com',
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
headers1 = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}

在成功具备的爬虫代码后,张开cmd运维pyinstaller将代码打包为exe,马到功成。

4858.com 3

终极来张周转的机能图。

以相册名称营造文件夹,分别存款和储蓄相册里的肖像,因为网络原因下载失利的照片,会唤醒下载退步并将url记录在文书夹的txt文书档案内。

4858.com 4

4858.com 5

显示屏截图(4).png

末尾是源码Python爬虫代码–人人网照片下载

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有