python 22天 selenium滚动和常见反爬
一 页面滚动设计
1 语法:执行滚动操作
执行js中滚动代码:window . scrollBy ( x 方向偏移量,y 方向偏移量)
- x , y 是像素值,
- 窗口左右滚动,就 y =0, 设置x的值,x为正,窗口就向右滚动,x的值为负,窗口就向左滚动,
- 窗口上下滚动就是x为0,设置y的值,y 的值为正,窗口就向下滚动,y的值为负,窗口就向上滚动。
- 为了加载完整个页面,就要让这个页面全部加载完,就要设置整个窗口一直滚动到最后,可以设置一个循环,让这个循环遍历完,就可以加载完这个页面,需要不停的试一试。
- 所有需要的数据都加载完了,就可以去分析数据。
2 . 例题展示
from time import sleep
from selenium.webdriver import Chrome
from bs4 import BeautifulSoup
##执行滚动操作 - 执行js中滚动代码:window.scrollby(x方向偏移量,y方向偏移量)
# 语法:b.execute_script('window.scrollBy(0, 1800)') ## b去执行的脚本代码(写的是执行的代码,就是窗口执行滚动)
b = Chrome()
b.get('https://www.jd.com/')
b.find_element_by_id('key').send_keys('手机\n')
sleep(1)
for x in range(10): # 为了滚动完整个界面,所有,就加入for循环,让它滚动5次,每次滑动700个像素,每次滚动后就睡眠1秒
b.execute_script('window.scrollBy(0, 700)')
sleep(1)
##解析数据,使用bs4
soup = BeautifulSoup(b.page_source,'lxml')
all_goods = soup.select('.gl-warp>li')
print(len(all_goods))
二 自动登录
自动登录即指的是,登录的时候,不需要登录账号,直接登录后,获取数据
2.1 requests 自动登录
- 原理:打开需要人工在浏览器上完成登录操作,获取登录后的cookie(信息),再通过代码发送请求时候携带登录后的cookie
- 流程:
- 第一步:打开要登录网站的地址,检查里面找到cookie代码,赋值粘贴下来。
- 第二步:在hesders里面,加入cookies,键是‘cookie’,键所对应的值是第一步在网站上找到的cookie代码,注意要是文本的形式,要加单引号。
- 第三步:登录
- 图片演示查找cookie流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIIaTwLG-1660742256940)(C:\Users\Lenovo\Pictures\Saved Pictures\作业\cookie查找.png)] - 案例
import requests
headers = {'cookie':'_zap=ca60578d-f63a-479c-9492-7b7b0b95f7ee; d_c0="ACDTxtE-aRWPTsoOmdNkFAgtJAhCIsPceYM=|1660620151"; captcha_session_v2=2|1:0|10:1660620151|18:captcha_session_v2|88:UmNUS1BtNTl0amRaamViekZhYUExalgyT3ZRSUl5blUvY2ZvZmRUdi83aEo2RmkvcXpjV0lRaHRPSE40WkNXcA==|6a59e50e7d0e1d8312652c5a736a6b029dbec7006c2fec4eea7663c7a0da2260; __snaker__id=rcHH6sXFrqyc7uc8; _9755xjdesxxd_=32; gdxidpyhxdE=dG7zuaM7yUr961IkuBJTX%2BwL%2FQ8WOHsgIuvtAQb7DLJAADn4OJxk4dznCicAqAeb386%5CrORXSeKruysrMJVi01f0jh%2BtehXvqxfpgJVKOv7AIvmMzfCNNqy4LU9k3WoLGY%5Cbzv8I3mztYDz4hRUHHo76Vc3LV2qKiBoo%2FcGeXcgzeumv%3A1660621052383; YD00517437729195%3AWM_NI=JwltrMPSI9D1Hh1kG5sWKbLootLt7aXZY2xt1XlfYcesswfoUdfdpYI0OEtXazYC5zfe22f5pyWK6zR5KqMbYy72v7h%2Fx97c345ZOwMLiVZsJFsm68addxfpg%2FxgqAPbR2I%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eea5c262f4af98b3fb549c8e8ea2d84a839f8eacc5449ab400d3d35da89f868bb52af0fea7c3b92a8aa9a495f147948d87dac73b8cb8ff8cc63fb1898583cf65adac8495b66b9c8697d3fb80f388a487dc69a7adbd98e56597bcaa85f3538bf081a6f754a3a697a4b872a6bbfed3e53fb4a799acb57292eb8592d06a9ba7f9d3f53dacf1b8dab669f1ecfbbbce7d8f94a7b7d9798a9abd8eb534a3bcac99e57ca5f1b888f44b94be9ed3cc37e2a3; YD00517437729195%3AWM_TID=z6osI32%2FO%2BBBUUFABVbRTYx02aTZEIzu; z_c0=2|1:0|10:1660620159|4:z_c0|92:Mi4xSTZ4MUV3QUFBQUFBSU5QRzBUNXBGU1lBQUFCZ0FsVk5mMXZvWXdEUDA0VlZMRi1raGxZblF2bk5TbUo2ZFR4c1ZB|3328268c1d656f2705ba0dfe31230c332fe9329aa4265bce9e788b72686233e4; q_c1=f63420298fff46358b69932c6ca905db|1660620159000|1660620159000; _xsrf=a5609fc2-30b0-4a3c-9c3c-19e6590d1305; tst=r; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1660620151,1660624534; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1660624534; ariaDefaultTheme=undefined; NOT_UNREGISTER_WAITING=1; KLBRSID=2177cbf908056c6654e972f5ddc96dc2|1660624536|1660624533; SESSIONID=NVlYvonWpuYCCbITjsNEOfo1W7PJkKFhUa2hdOifc6O; JOID=UF4VAE0bDSgpiKCVGxrN_Vtcn_wMUV1HdfrL_U9vfHdpzsbYSYAW1UqIopAdLBNqX3j3180mkJFygC3RCYYaoZI=; osd=VVwQAkseDy0rjqWXHhjL-FlZnfoJU1hFc__J-E1peXVszMDdS4UU00-Kp5IbKRFvXX7y1cgklpRwhS_XDIQfo5Q=',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
response = requests.get('https://www.zhihu.com/',headers=headers)
print(response.text)
2.2 selenium 自动登录
- 原理:打开需要自动完成登录的网站,人工在浏览器上完成登录操作,初始打开的界面刷新后获取登录后的cookie(信息),保存在本地文件,再给对象b添加cookie,添加完成后登录。
- 流程:
- 第一步:打开需要完成自动登录的网站(需要获得cookie的网站)
b.get('https://www.taobao.com/')
- 第二步:给足够的时间让人工完成自动登录,并且人工刷新出登录后的页面,特别强调,一定要把第一个页面刷新出登录之后状态
- 第三步:获取登录后的cookie,并将获取到的cookie文件保存在本地文件。
cookies = b.get_cookies() #
# print(cookies)
with open('file/taobao.txt','wt',encoding='utf-8') as f:
f.write(dumps(cookies))
- 第四步:从本地文件中,把得到cookie拿出来,给b这个对象添加cookie值,因为保存的cookie值是以json格式保存,所有,要先将从文件中读到的内容保存成python格式,得到的是一个列表,就可以对列表进行循环,将cookie的值添加给b.
- 第五步:重新打开需要登录的界面
## 首先获取cookie代码
# 1.打开需要完成自动登录的网站(需要获得cookie的网站)
b.get('https://www.taobao.com/')
# 2. 给足够的时间让人工完成自动登录,并且并且人工刷新出登录后的页面
# # 强调:一定要把第一个页面刷新出登录之后的状态
input('已经完成登录')
# 3. 获取登录后的cookie,并且将获取到的cookie保存在本地文件
cookies = b.get_cookies() #
# print(cookies)
with open('file/taobao.txt','wt',encoding='utf-8') as f:
f.write(dumps(cookies))
##拿到cookie代码后给对象b添加cookie,然后重新登录
# 1.打开需要自动登录网页
b.get('https://www.taobao.com/')
# 2.添加cookie
with open('file/taobao.txt','r',encoding='utf-8') as f:
content = f.read() #读f的内容,后赋值给content
cookies = loads(content)
for x in cookies:
b.add_cookie(x)
# 3 重新打开需要登录的网页
b.get('https://www.taobao.com/')
三 代理ip设置
3.1 requests代理ip设置及使用
- 代理ip 的设置
- 第一步:要有一个代理ip的账号
- 代理ip的设置:两种写法
#写法1
proxies = {
'http':'221.10.104.78:4531',
'https':'221.10.104.78:4531'
}
# 写法2
proxies = {
'http':'http://119.7.147.182:4531',
'https':'http://119.7.147.182:4531'
}
- 第二步:设置好代理ip,在请求数据的时候,加上headers , proxies .就可以拿到数据
- 案例
import requests
#https://www.douban.com/
#代理ip 221.10.104.78:4531
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
proxies = {
# 'http':'221.10.104.78:4531',
# 'https':'221.10.104.78:4531'
'http':'http://119.7.147.182:4531',
'https':'http://119.7.147.182:4531'
}
response = requests.get('https://www.douban.com/',headers=headers,proxies=proxies)
print(response.text)
###requests的实际应用
import requests
from time import sleep
def get_ip():
url = 'http://d.jghttp.alicloudecs.com/getip?num=1&type=1&pro=510000&city=510600&yys=0&port=11&time=2&ts=0&ys=0&cs=0&lb=4&sb=0&pb=4&mr=1®ions='
while True:
response = requests.get(url)
if response.text[0] == '{':
sleep(1)
continue
return response.text
def get_douban_film():
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
ip = get_ip()
print(ip)
proxies = {
'http':ip,
'https':ip
}
response = requests.get('https://www.douban.com/',headers=headers,proxies=proxies)
print(response.text)
if __name__ == '__main__':
get_douban_film()
3.2 selenium代理ip设置
response = requests.get('https://www.douban.com/',headers=headers,proxies=proxies)
print(response.text)
if name == ‘main’:
get_douban_film()
#### 3.2 selenium代理ip设置