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设置