使用代理ip
-
准备一堆的ip地址,组成ip池,随机选择一个ip来使用
-
如何选择代理ip, 让使用次数较少的ip地址更大可能性被使用到
- {“ip”:ip,“times”:0}
- [{},{},{},{}],对这个ip列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中选择一个
-
检查ip的可用性
- 可以使用requesrs添加超时参数,判断ip地址的质量
- 在线代理ip质量检测网站
携带cookie请求
- 携带一堆cookie进行请求,把cookie组成cookie池
使用requests提供的session类来请求登录之后的网站思路
- 实例化一个session
- 先使用session发送请求,登录对应网站,吧cookie保存在session
- 再使用session请求登录之后才能访问的网站,session能够自动携带登录成功时保存字啊期中的cookie,进行请求
不发送post请求,使用cookie获取登录的页面
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到数据,比较麻烦
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
获取登录后的页面的三种方式
- 实例化session,使用session发送post请求,在使用它获取登录后的页面
- header中添加coolie键,值为cookie字符串
- 在请求方法添加cookie参数,接受字典 形式的cookie。字典形式的cookie中的键是cookie的name对应的值,值是cookie终的value对应的值
字典推导式列表推导式
- 字典:{i:i+10 for i in range(10)}
- 字典是无序的
- 列表: [i for i in range(10)]
cookies = "anonymid=kdear8fg-7pw60h; depovince=GW; _r01_=1; taihe_bi_sdk_uid=cd55da6e8f9997e2eb7ce7f78ea01507; __utmz=151146938.1596448156.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/SysHome.do; __utma=151146938.1542855537.1596448156.1596448156.1596448156.1; wp_fold=0; JSESSIONID=abc3AeTrOqm1k7AuIYZox; ick_login=7a54bce4-6251-4522-a4d2-267438300bea; taihe_bi_sdk_session=259fcd2f3037ceb6f68339025ac997a0; __utmc=151146938; ick=59a128d4-002e-4652-bf4a-c3460716d440; first_login_flag=1; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; __utmt=1; __utmb=151146938.14.10.1596448156; ln_uact=2031058091@qq.com; jebecookies=582e1e95-0253-4621-ae65-fdcf2b437d0e|||||; _de=609C0E1476FC863817DDA621B1A555F76DEBB8C2103DE356; p=94c0ade056133b6f95deb0985975e2b07; t=81cd4d25ee087423f1d22d54ffad66957; societyguester=81cd4d25ee087423f1d22d54ffad66957; id=348632857; xnsid=4c3162e8; loginfrom=syshome"
# 字典推导式 split() 按什么分割字符串
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
# 列表推导式
[self.url_temp.format(i * 50) for i in range(1000)]
寻找登录的post地址
- 在 form表单中寻找action对应的url地址
- post的数据是input标签中的name的值作为键,真正的用户名密码作为值的字典,post的url地址就是action对应的url地址
- 抓包, 寻找登录的url地址
-
- 使用错误的密码,然后看请求的地址
- 将Network中的Preserve log选中,防止页面跳转找不到url地址,就会有登录之前跳转的信息
-
- 寻找postpost数据,确定参数
- 参数不会变, 直接用,比如密码不是动态加密的时候
- 参数会变
- 参数在当前响应中
- 通过js生成
- 寻找postpost数据,确定参数
-
定位想要的js
- 选择会触发js事件的按钮, 点击 event listener,找到js的位置
- 通过chrome中的search all file/search 来搜索url中的关键字
- 通过断点来查看js的操作,通过python来进行同样的操作
requests技巧使用
- requests.cookie
- 将cookie对象转化为字典:
- : requests.utils.dict_from_cookiejar(requests.cookie)
- 将字典转化成cookie对象
- :requests.utils.cookiejar_from_dict({“name”:“value”})
- url地址的解码
- :requests.utils.unquote()
- url地址编码
- : requests.utils.quote()
- 请求ssl证书验证
- : requests.get(url, verify=False)
- 设置超时
- :response = requests.get(url, timeout=10)
- 配合状态码判断请求是否请求成功
- assert reponse.statue_code==200
- 将cookie对象转化为字典:
报错后刷新,进行重新运行 parse_url.py
-
retrying模块
-
通过装饰器的方式使用
-
@retry(stop_max_attempt_number=3) 即程序报错三次后才会出现异常
# coding=utf-8 import requests from retrying import retry headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"} @retry(stop_max_attempt_number=3) def _parse_url(url, method, data, proxies): """发送请求,获取响应""" if method == "POST": response = requests.post(url,data=data, headers=headers, proxies=proxies) else: response = requests.get(url, headers=headers,timeout=3, proxies=proxies) assert response.status_code == 200 return response.content.decode() def parse_url(url, method="GET", data=None, proxies={}): """ 异常判断 method:请求方式 data:数据 proxies:代理ip """ try: html_str = _parse_url(url, method, data, proxies) except: html_str = None return html_str if __name__ == '__main__': url = "http://www.baidu.com" print(parse_url(url))
安装第三方模块
- pip install ***
- 下载源码解码,进入解压后的目录,
python setup.py install
***.whl
安装方法pip install ***.whl