Day-5 python

上周作业:爬取豆瓣TOP250电影信息

 1 '''
 2 爬取豆瓣TOP250电影信息
 3 
 4 主页:
 5     第一页:
 6         https://movie.douban.com/top250?start=0&filter=
 7     第二页:
 8         https://movie.douban.com/top250?start=25&filter=
 9     第三页:
10         https://movie.douban.com/top250?start=50&filter=
11     第十页:
12         https://movie.douban.com/top250?start=225&filter=
13     GET
14     User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36
15 
16 re正则:
17     # 电影详情页url、图片链接、电影名称、电影评分、导演、主演、电影上映时间、评价人数、简介
18     <div class="item">.*?href="(.*?)">.*?src="(.*?)" class="">.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?导演:(.*?)<br>(.*?)</p>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价<span class="inq">(.*?)</span>
19 '''
20 import requests
21 import re
22 
23 
24 headers = {
25     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
26 }
27 base_url = 'https://movie.douban.com/top250?start={}&filter='
28 
29 n = 0
30 for line in range(10):
31     print()
32     url = base_url.format(n)
33     print(type(n))
34     n += 25
35     print(url)
36 # 1、往豆瓣TOP250发送请求获取响应数据
37 response = requests.get(url, headers=headers)
38 
39 # print(response.text)
40 
41 # 2、通过正则解析提取数据
42 # 电影详情页url、图片链接、电影名称、电影评分、评价人数
43 movie_content_list = re.findall(
44     # 正则规则
45     # 电影评分、评价人数、
46 
47     '<div class="item">.*?href="(.*?)">.*?src="(.*?)" class="">.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?导演:(.*?)<br>(.*?)</p>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价.*?<span class="inq">(.*?)</span>',
48 
49     # 解析文本
50     response.text,
51 
52     # 匹配模式
53     re.S)
54 
55 for movie_content in movie_content_list:
56     # 解压赋值每一部电影
57     detail_url, movie_jpg, name, daoyan, timer, point, num, desc = movie_content
58     data = f'电影名称:{name},详情页url:{detail_url}, 图片url:{movie_jpg},导演:{daoyan},上映时间:{timer}, 评分: {point}, 评价人数: {num}, 简介:{desc} 
'
59     print(data)
60 
61     # 3、保存数据,把电影信息写入文件中
62     with open('豆瓣top250.txt', 'a', encoding='utf-8') as f:
63         f.write(data)

今日内容:

  1、requests之POST请求
  2、requests高级用法
  3、selenium基本使用
  4、万能破解登录


一、
requests之POST请求
  1 '''
  2 post请求访问github
  3 请求url:
  4     https://github.com/session
  5 请求方式:
  6     POST
  7 请求头:
  8     # 上一次请求从哪里来
  9     Referer:https://github.com/login
 10     User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
 11 请求体:
 12     只有POST请求才会有请求体。
 13     commit: 登入
 14     utf8: ✓
 15     authenticity_token: 1ZoPGWJBCBMW/IzHozPRLB1UJBfw0/SnHtGeqbKULG1Xb1YPxFhKmKKFPs9meYV0IdjGKnXYqTH9nASzPNYOnw==
 16     login: shendongnian
 17     password: 1111
 18     webauthn-support: supported
 19 
 20 '''
 21 import requests
 22 import re
 23 
 24 # 一、访问login页面获取token信息
 25 '''
 26 请求url:
 27     https://github.com/login
 28 请求方式:
 29     GET
 30 响应头:
 31     Set-Cookie:
 32 请求头:
 33     Cookie:
 34     User-Agent:
 35 '''
 36 headers = {
 37     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
 38 }
 39 
 40 response = requests.get(url='https://github.com/login', headers = headers)
 41 # print(response.text)
 42 # 把login页返回的cookies信息转换成字典
 43 login_cookies = response.cookies.get_dict()
 44 
 45 authenticity_token = re.findall('<input type="hidden" name="authenticity_token" value="(.*?)" />',response.text,re.S)[0]
 46 
 47 print(authenticity_token)
 48 
 49 # 二、往sessionurl发送POST请求
 50 '''
 51 post请求登录github
 52 请求url:
 53     https://github.com/session
 54 
 55 请求方式:
 56     POST
 57 
 58 请求头:
 59     # 上一次请求从哪里来
 60     Referer:https://github.com/login
 61     Cookie:...
 62     User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
 63 
 64 请求体:
 65     只有POST请求才会有请求体。
 66     commit: 登入
 67     utf8: ✓
 68     authenticity_token:    1ZoPGWJBCBMW/IzHozPRLB1UJBfw0/SnHtGeqbKULG1Xb1YPxFhKmKKFPs9meYV0IdjGKnXYqTH9nASzPNYOnw==
 69     login: shendongnian
 70     password: 1111
 71     webauthn-support: supported
 72 
 73 '''
 74 # 拼接头信息
 75 headers2 = {
 76     'Referer':'https://github.com/login',
 77     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
 78 }
 79 
 80 
 81 # cookies = {
 82 #     'Cookies':''
 83 # }
 84 
 85 # 拼接请求体信息
 86 from_data = {
 87     "commit":"登入",
 88     "utf8": "",
 89     "authenticity_token":authenticity_token,
 90     "login":"tankjam",
 91     "password":"kermit46709394",
 92     "webauthn-support":"unsupported"
 93 }
 94 
 95 # 往session地址发送post请求
 96 # 携带请求头、请求体、login页的cookie信息
 97 
 98 response2 = requests.post(url='https://github.com/session',data=from_data,headers = headers2,cookies=login_cookies)
 99 print(response2.status_code)
100 # print(response2.text)
101 with open('github.html','w',encoding='utf-8') as f:
102     f.write(response2.text)



二、requests响应
  1 '''
  2 post请求访问github
  3 请求url:
  4     https://github.com/session
  5 请求方式:
  6     POST
  7 请求头:
  8     # 上一次请求从哪里来
  9     Referer:https://github.com/login
 10     User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
 11 请求体:
 12     只有POST请求才会有请求体。
 13     commit: 登入
 14     utf8: ✓
 15     authenticity_token: 1ZoPGWJBCBMW/IzHozPRLB1UJBfw0/SnHtGeqbKULG1Xb1YPxFhKmKKFPs9meYV0IdjGKnXYqTH9nASzPNYOnw==
 16     login: shendongnian
 17     password: 1111
 18     webauthn-support: supported
 19 
 20 '''
 21 import requests
 22 import re
 23 
 24 # 一、访问login页面获取token信息
 25 '''
 26 请求url:
 27     https://github.com/login
 28 请求方式:
 29     GET
 30 响应头:
 31     Set-Cookie:
 32 请求头:
 33     Cookie:
 34     User-Agent:
 35 '''
 36 headers = {
 37     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
 38 }
 39 
 40 response = requests.get(url='https://github.com/login', headers = headers)
 41 # print(response.text)
 42 # 把login页返回的cookies信息转换成字典
 43 login_cookies = response.cookies.get_dict()
 44 
 45 authenticity_token = re.findall('<input type="hidden" name="authenticity_token" value="(.*?)" />',response.text,re.S)[0]
 46 
 47 print(authenticity_token)
 48 
 49 # 二、往sessionurl发送POST请求
 50 '''
 51 post请求登录github
 52 请求url:
 53     https://github.com/session
 54 
 55 请求方式:
 56     POST
 57 
 58 请求头:
 59     # 上一次请求从哪里来
 60     Referer:https://github.com/login
 61     Cookie:...
 62     User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36
 63 
 64 请求体:
 65     只有POST请求才会有请求体。
 66     commit: 登入
 67     utf8: ✓
 68     authenticity_token:    1ZoPGWJBCBMW/IzHozPRLB1UJBfw0/SnHtGeqbKULG1Xb1YPxFhKmKKFPs9meYV0IdjGKnXYqTH9nASzPNYOnw==
 69     login: shendongnian
 70     password: 1111
 71     webauthn-support: supported
 72 
 73 '''
 74 # 拼接头信息
 75 headers2 = {
 76     'Referer':'https://github.com/login',
 77     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
 78 }
 79 
 80 
 81 # cookies = {
 82 #     'Cookies':''
 83 # }
 84 
 85 # 拼接请求体信息
 86 from_data = {
 87     "commit":"登入",
 88     "utf8": "",
 89     "authenticity_token":authenticity_token,
 90     "login":"tankjam",
 91     "password":"kermit46709394",
 92     "webauthn-support":"unsupported"
 93 }
 94 
 95 # 往session地址发送post请求
 96 # 携带请求头、请求体、login页的cookie信息
 97 
 98 response2 = requests.post(url='https://github.com/session',data=from_data,headers = headers2,cookies=login_cookies)
 99 print(response2.status_code)
100 # print(response2.text)
101 with open('github.html','w',encoding='utf-8') as f:
102     f.write(response2.text)

三、requests高级用法

  1 import requests
  2 
  3 https = http + ssl(携带证书)
  4 
  5 
  6 #证书验证(大部分网站都是https)
  7 import requests
  8 # 如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
  9 response = requests.get('https://www.xiaohuar.com')
 10 print(response.status_code)
 11 
 12 # 改进1:去掉报错,但是会报警告
 13 # import requests
 14 # response = requests.get('https://www.xiaohuar.com', verify=False)  # True携带证书 False不携带证书
 15 # # 不验证证书,报警告,返回200
 16 # print(response.status_code)
 17 
 18 # 改进2:去掉报错,并且去掉警报信息
 19 import requests
 20 import urllib3
 21 urllib3.disable_warnings()  # 关闭警告
 22 response = requests.get('https://www.xiaohuar.com', verify=False)
 23 print(response.status_code)
 24 
 25 # 改进3:加上证书
 26 # 很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
 27 # 知乎百度等都是可带可不带
 28 # 有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
 29 import requests
 30 import urllib3
 31 # urllib3.disable_warnings()  # 关闭警告
 32 # 伪代码
 33 response = requests.get(
 34     'https://www.xiaohuar.com',
 35     # verify=False,
 36     # /path/server.crt证书的存放目录,/path/key
 37     cert=('/path/server.crt', '/path/key'))
 38 print(response.status_code)
 39 
 40 
 41 
 42 '''
 43 超时设置
 44 '''
 45 
 46 超时设置
 47 两种超时:float or tuple
 48 timeout=0.1  # 代表接收数据的超时时间
 49 timeout=(0.1,0.2)  # 0.1代表链接超时  0.2代表接收数据的超时时间
 50 
 51 import requests
 52 
 53 response = requests.get('https://www.baidu.com',
 54                         timeout=0.0001)
 55 
 56 print()
 57 
 58 代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
 59 import requests
 60 proxies={
 61     # 带用户名密码的代理,@符号前是用户名与密码
 62     'http':'http://tank:123@localhost:9527',
 63     'http':'http://localhost:9527',
 64     'https':'https://localhost:9527',
 65 }
 66 response=requests.get('https://www.12306.cn',
 67                      proxies=proxies)
 68 
 69 print(response.status_code)
 70 
 71 
 72 '''
 73 爬取西刺免费代理:
 74     1.访问西刺免费代理页面
 75     2.通过re模块解析并提取所有代理
 76     3.通过ip测试网站对爬取的代理进行测试
 77     4.若test_ip函数抛出异常代表代理作废,否则代理有效
 78     5.利用有效的代理进行代理测试
 79 
 80 <tr class="odd">
 81       <td class="country"><img src="//fs.xicidaili.com/images/flag/cn.png" alt="Cn"></td>
 82       <td>112.85.131.99</td>
 83       <td>9999</td>
 84       <td>
 85         <a href="/2019-05-09/jiangsu">江苏南通</a>
 86       </td>
 87       <td class="country">高匿</td>
 88       <td>HTTPS</td>
 89       <td class="country">
 90         <div title="0.144秒" class="bar">
 91           <div class="bar_inner fast" style="88%">
 92 
 93           </div>
 94         </div>
 95       </td>
 96       <td class="country">
 97         <div title="0.028秒" class="bar">
 98           <div class="bar_inner fast" style="97%">
 99 
100           </div>
101         </div>
102       </td>
103 
104       <td>6天</td>
105       <td>19-05-16 11:20</td>
106     </tr>
107 re:
108     <tr class="odd">(.*?)</td>.*?<td>(.*?)</td>
109 
110 '''
111 import requests
112 import re
113 import time
114 
115 HEADERS = {
116     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
117 }
118 
119 
120 def get_index(url):
121     time.sleep(1)
122     response = requests.get(url, headers=HEADERS)
123     return response
124 
125 
126 def parse_index(text):
127     ip_list = re.findall('<tr class="odd">.*?<td>(.*?)</td>.*?<td>(.*?)</td>', text, re.S)
128     for ip_port in ip_list:
129         ip = ':'.join(ip_port)
130         yield ip
131 
132 def test_ip(ip):
133     print('测试ip: %s' % ip)
134     try:
135         proxies = {
136             'https': ip
137         }
138 
139         # ip测试网站
140         ip_url = 'https://www.ipip.net/'
141 
142         # 使用有效与无效的代理对ip测试站点进行访问,若返回的结果为200则代表当前测试ip正常
143         response = requests.get(ip_url, headers=HEADERS, proxies=proxies, timeout=1)
144 
145         if response.status_code == 200:
146             print(f'有用的ip:{ip}')
147             return ip
148 
149     # 若ip代理无效则抛出异常
150     except Exception as e:
151         print(e)
152 
153 # 使用代理爬取nba
154 def spider_nba(good_ip):
155     url = 'https://china.nba.com/'
156 
157     proxies = {
158         'https': good_ip
159     }
160 
161     response = requests.get(url, headers=HEADERS, proxies=proxies)
162     print(response.status_code)
163     print(response.text)
164 
165 
166 if __name__ == '__main__':
167     base_url = 'https://www.xicidaili.com/nn/{}'
168 
169     for line in range(1, 3677):
170         ip_url = base_url.format(line)
171 
172         response = get_index(ip_url)
173 
174         # 解析西刺代理获取每一个ip列表
175         ip_list = parse_index(response.text)
176 
177         # 循环每一个ip
178         for ip in ip_list:
179             # print(ip)
180 
181             # 对爬取下来的ip 进行测试
182             good_ip = test_ip(ip)
183 
184             if good_ip:
185                 # 真是代理,开始测试
186                 spider_nba(good_ip)
187 
188 
189 # 认证设置
190 '''
191 登录网站时,会弹出一个框,要求你输入用户名与密码(类似于alert),此时无法进入html页面,待授权通过后才能进入html页面。
192 
193 Requests模块为我们提供了多种身份认证方式,包括基本身份认证等...
194 
195 其原理指的是通过输入用户名与密码获取用户的凭证来识别用户,然后通过token对用户进行授权。
196 基本身份认证:
197     HTTP Basic Auth是HTTP1.0提出的认证方式。客户端对于每一个realm,通过提供用户名和密码来进行认证的方式当认证失败时,服务器收到客户端请求,返回401。
198 
199 '''
200 import requests
201 # 通过访问github的api来测试
202 url = 'https://api.github.com/user'
203 HEADERS = {
204     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
205 }
206 
207 # 测试1,失败返回401
208 response = requests.get(url, headers=HEADERS)
209 print(response.status_code)  # 401
210 print(response.text)
211 '''
212 打印结果:
213     {
214       "message": "Requires authentication",
215       "documentation_url": "https://developer.github.com/v3/users/#get-the-authenticated-user"
216     }
217 '''
218 
219 # 测试2,通过requests.auth内的HTTPBasicAuth进行认证,认证成功返回用户信息
220 from requests.auth import HTTPBasicAuth
221 response = requests.get(url, headers=HEADERS, auth=HTTPBasicAuth('tankjam', 'kermit46709394'))
222 print(response.text)
223 
224 
225 # 测试3,通过requests.get请求内的auth参数默认就是HTTPBasicAuth,认证成功返回用户信息
226 # response = requests.get(url, headers=HEADERS, auth=('tankjam', 'kermit46709394'))
227 # print(response.text)
228 '''
229 打印结果:
230     {
231       "login": "TankJam",
232       "id": 38001458,
233       "node_id": "MDQ6VXNlcjM4MDAxNDU4",
234       "avatar_url": "https://avatars2.githubusercontent.com/u/38001458?v=4",
235       "gravatar_id": "",
236       "url": "https://api.github.com/users/TankJam",
237       "html_url": "https://github.com/TankJam",
238       "followers_url": "https://api.github.com/users/TankJam/followers",
239       "following_url": "https://api.github.com/users/TankJam/following{/other_user}",
240       "gists_url": "https://api.github.com/users/TankJam/gists{/gist_id}",
241       "starred_url": "https://api.github.com/users/TankJam/starred{/owner}{/repo}",
242       "subscriptions_url": "https://api.github.com/users/TankJam/subscriptions",
243       "organizations_url": "https://api.github.com/users/TankJam/orgs",
244       "repos_url": "https://api.github.com/users/TankJam/repos",
245       "events_url": "https://api.github.com/users/TankJam/events{/privacy}",
246       "received_events_url": "https://api.github.com/users/TankJam/received_events",
247       "type": "User",
248       "site_admin": false,
249       "name": "kermit",
250       "company": null,
251       "blog": "",
252       "location": null,
253       "email": null,
254       "hireable": null,
255       "bio": null,
256       "public_repos": 6,
257       "public_gists": 0,
258       "followers": 0,
259       "following": 0,
260       "created_at": "2018-04-02T09:39:33Z",
261       "updated_at": "2019-05-14T07:47:20Z",
262       "private_gists": 0,
263       "total_private_repos": 1,
264       "owned_private_repos": 1,
265       "disk_usage": 8183,
266       "collaborators": 0,
267       "two_factor_authentication": false,
268       "plan": {
269         "name": "free",
270         "space": 976562499,
271         "collaborators": 0,
272         "private_repos": 10000
273       }
274     }
275 '''
276 
277 
278 上传文件
279 import requests
280 
281 # 上传文本文件
282 files1 = {'file': open('user.txt', 'rb')}
283 # files参数是POST请求固定参数
284 response = requests.post('http://httpbin.org/post', files=files1)
285 print(response.status_code)  # 200
286 print(response.text)  # 200
287 
288 # 上传图片文件
289 files2 = {'jpg': open('一拳超人.jpg', 'rb')}
290 response = requests.post('http://httpbin.org/post', files=files2)
291 print(response.status_code)  # 200
292 print(response.text)  # 200
293 
294 # 上传视频文件
295 files3 = {'movie': open('love_for_GD.mp4', 'rb')}
296 
297 response = requests.post('http://httpbin.org/post', files=files3)
298 print(response.status_code)  # 200
299 print(response.text)  # 200

四、selenium基本使用

  1 '''
  2 selenium模块讲解
  3 一、什么是selenium?
  4     最初是一个自动化测试工具。可以使用它帮我们驱动浏览器自动去执行某些自定义好的操作。例如在页面中执行JS代码、跳过登录验证。
  5     (selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。
  6     selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用浏览器自动访问目标站点并操作,那我们也可以拿它来做爬虫。
  7     selenium本质上是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等...进而拿到网页渲染之后的结果,可支持多种浏览器。)
  8 
  9 二、为什么要使用selenium?
 10     1、优点:
 11         要使用requests模块登录需要分析大量的复杂通信流程,使用selenium可以轻松跳过登录验证。
 12     2、缺点:
 13         浏览器会加载css、js、图片、视频...数据,爬虫效率相比requests模块要低。
 14 
 15 三、如何使用?
 16     下载selenium模块:
 17         pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
 18     下载浏览器驱动:
 19         http://npm.taobao.org/mirrors/chromedriver/2.38/
 20 '''
 21 
 22 # selenium之第一次测试
 23 from selenium import webdriver  # 用来驱动浏览器的
 24 
 25 # 调用得到一个动作链对象,破解华东验证码的时候用的,可以拖动图片
 26 from selenium.webdriver import ActionChains
 27 
 28 # 按照什么方式查找属性,By.ID,By.CSS_SELECTOR,By.Class
 29 from selenium.webdriver.common.by import By
 30 
 31 from selenium.webdriver.common.keys import Keys  # 键盘按键操作
 32 
 33 # 和下面WebDriverWait一起用的,EC 是expected_conditions的别名
 34 from selenium.webdriver.support import expected_conditions as EC
 35 
 36 # 等待页面加载某些元素
 37 from selenium.webdriver.support.wait import WebDriverWait
 38 
 39 import time
 40 
 41 # 通过谷歌浏览器驱动打开谷歌浏览器
 42 # chrome = webdriver.Chrome(r'chromedriver.exe的绝对路径')
 43 chrome = webdriver.Chrome(r'D:Pythonchromedriver_win32chromedriver')  # 括号内输入chromedriver.exe的绝对路径
 44 '''
 45 # chromedriver.exe存放于python解释器的Scripts文件夹中
 46 
 47 # chrome是一个驱动对象
 48 chrome = webdriver.Chrome()
 49 '''
 50 '''
 51 实例1
 52 '''
 53 
 54 # 若try出现异常
 55 try:
 56     # 往tank博客主页发送get请求
 57     # chrome.get('https://www.cnblogs.com/kermitjam')
 58 
 59     # 参数1:驱动对象  参数2:等待时间
 60     wait = WebDriverWait(chrome, 10)
 61 
 62     # 1、访问百度
 63     chrome.get('https://www.baidu.com/')
 64 
 65     # 2、查找input输入框
 66     # 调用EC的presence_of_element_located()
 67     input_tag = wait.until(EC.presence_of_element_located((By.ID, "kw")))
 68     # 此处可以写一个元组
 69     # 参数1:查找属性的方式
 70     # 参数2:属性的名字
 71 
 72     # 3、搜索一拳超人
 73     input_tag.send_keys('一拳超人')
 74 
 75     # 4、按键盘回车键
 76     input_tag.send_keys(Keys.ENTER)
 77 
 78     time.sleep(3)
 79 
 80 # 无论发生什么都会关闭浏览器
 81 finally:
 82     # 关闭浏览器
 83     chrome.close()
 84 
 85 
 86 
 87 '''
 88 实例2
 89 '''
 90 try:
 91     # 往tank博客主页发送get请求
 92     # chrome.get('https://www.cnblogs.com/kermitjam')
 93 
 94     # 参数1:驱动对象  参数2:等待时间
 95     wait = WebDriverWait(chrome, 10)
 96 
 97     # 1、访问百度
 98     chrome.get('https://www.jd.com/')
 99 
100     # 2、查找input输入框
101     input_tag = wait.until(EC.presence_of_element_located((By.ID, "key")))
102 
103     # 3、搜索唐诗三百首
104     input_tag.send_keys('唐诗三百首')
105 
106     # 4、根据class属性名称查找标签
107     search_button = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'button')))
108 
109     # 5、点击搜索按钮
110     search_button.click()
111 
112     time.sleep(3)
113 
114 # 无论发生什么都会关闭浏览器
115 finally:
116     # 关闭浏览器
117     chrome.close()

五、selenium之基本选择器

 1 from selenium import webdriver
 2 import time
 3 
 4 
 5 '''
 6 隐式等待
 7 '''
 8 # 获取驱动对象
 9 driver = webdriver.Chrome(r'D:Pythonchromedriver_win32chromedriver')
10 
11 # 获取
12 try:
13     # 显式等待:等待某个元素加载
14     # 参数1:驱动对象  参数2:等待时间
15     # wait = WebDriverWait(chrome, 10)
16 
17     driver.get('https://china.nba.com')
18 
19     # 隐式等待:等待页面所有元素加载
20     driver.implicitly_wait(10)
21     news_tag = driver.find_element_by_class_name('nav-news')
22     # 获取标签对象
23     print(news_tag)
24     # 获取标签名字
25     print(news_tag.ag_name)
26     time.sleep(10)
27 
28 
29 finally:
30     chrome.close()
31 
32 
33 
34 '''
35 ===============所有方法===================
36     element是查找一个标签
37     elements是查找所有标签
38 
39     1、find_element_by_link_text  通过链接文本去找
40     2、find_element_by_id 通过id去找
41     3、find_element_by_class_name
42     4、find_element_by_partial_link_text
43     5、find_element_by_name
44     6、find_element_by_css_selector
45     7、find_element_by_tag_name
46 '''
47 try:
48 
49     # 往百度主页发送请求
50     driver.get('https://www.baidu.com/')
51     driver.implicitly_wait(10)
52 
53     # 1、find_element_by_link_text 通过链接文本去找
54     # 根据登录
55     send_tag = driver.find_element_by_link_text('登录')
56     send_tag.click()
57 
58 
59     # 2、find_element_by_partial_link_text 通过局部文本查找a标签
60     login_button = driver.find_element_by_partial_link_text('')
61     login_button.click()
62     time.sleep(1)
63 
64     # 3、find_element_by_class_name 根据class属性名查找
65     login_tag = driver.find_element_by_class_name('tang-pass-footerBarULogin')
66     login_tag.click()
67     time.sleep(1)
68 
69     # 4、find_element_by_name  根据name属性查找
70     username = driver.find_element_by_name('userName')
71     username.send_keys('15055303102')
72     time.sleep(1)
73 
74 
75     # 5、find_element_by_id  通过id属性名查找
76     password = driver.find_element_by_id('TANGRAM__PSP_10__password')
77     password.send_keys('shenjin981002')
78     time.sleep(1)
79 
80     # 6、find_element_by_css_selector 根据属性选择器查找
81     # 根据id查找登录按钮
82     login_submit = driver.find_element_by_css_selector('#TANGRAM__PSP_10__submit')
83     # login_submit = driver.find_element_by_css_selector('.pass-button-submit')
84     login_submit.click()
85 
86     # 7、find_element_by_tag_name  根据标签名称查找标签
87     div = driver.find_element_by_tag_name('div')
88     print(div.tag_name)
89 
90     time.sleep(10)
91 
92 
93 finally:
94     driver.close()
今日作业:
  
1、整理课堂笔记并编写博客
   2、爬取快代理
(参考爬取西刺代理代码)
    https://www.kuaidaili.com/free/
   3、熟悉selenium模块,敲上课例子
   4、自动登录抽屉新热榜
  

  
 


原文地址:https://www.cnblogs.com/shendongnian/p/11042262.html