爬虫之常见的反扒
cookies
一般用requests直接请求网址的时候有时候可能会遇到反扒措施,这时候可以考虑一下加上user-agent伪装成浏览器;也可能有登录限制,这时候cookies就有用处了
浏览器中的cookie是保存我们的账号数据和访问记录,在爬取的过程中加上cookie可以增加爬取数据的成功几率
获取cookies有两种方式,一种是requests 获取cookies ;一种是selenium获取cookies
1、requests获取cookies
自动登录原理:人工在浏览器上完成登录操作,获取登录之后的cookie信息,再通过代码发送请求的时候携带cookies信息
requests 获取cookies步骤:
浏览器打开网址——浏览器控制台——network——all——headers——cookie ——将cookies的值复制
import requests
headers = {'cookie':'.....'
}
resp=requests.get('https://www.zhihu.com/',headers=headers)
print(resp.text)
2、selenium获取cookies
获取自动登录网站的cookies
· 打开需要完成自动登录的网站(需要获取cookie的网站)
· 给足够长的时候让人工完成自动登录并且人工刷新出登录之后的页面
强调:一定要吧第一个页面刷新出登之后的转态
· 获取登录之后的cookie并且将获取到的cookie保存到本地文件
from selenium.webdriver import Chrome
from json import dumps
b = Chrome()
# 1. 打开需要完成自动登录的网站(需要获取cookie的网站)
b.get('https://www.taobao.com/')
# 2. 给足够长的时间让人工完成自动登录并且人工刷新出登录后的页面
# 强调:一定要把第一个页面刷新出登录之后的状态
input('已经完成登录:')
# 3. 获取登录后的cookie并且将获取到的cookie保存到本地文件
cookies = b.get_cookies()
print(cookies)
with open('file3/taobao.txt', 'w', encoding='utf-8') as f:f.write(dumps(cookies))
3、selenium使用cookies
· 打开需要自动登录的网站
· 添加cookies
· 重新打开需要登录的网页
from selenium.webdriver import Chrome
from json import loads
b = Chrome()
# 1. 打开需要自动登录网页
b.get('https://www.taobao.com/')
# 2. 添加cookie
with open('file3/taobao.txt', encoding='utf-8') as f:content = f.read()cookies = loads(content)
for x in cookies:b.add_cookie(x)
# 3. 重新打开需要登录的网页
b.get('https://www.taobao.com/')
代理ip
在爬取网站的过程中,因为频繁访问该网站,会出现ip被封情况,但是又必须获取该数据,可以用代理ip来访问该网站;分为两种情况,requests和selenium
1、requests 使用代理ip
获取代理ip的流程------省略
用法如下:
import requests
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
# 两种proxies方式选择其一
# proxies = {
# 'http':'.....',
# 'https':'.....'
# }
proxies = {'http':'http://119.7.147.173:4531','https':'http://119.7.147.173:4531'
}
response=requests.get('https://movie.douban.com/top250',headers=headers,proxies=proxies)
print(response.text)
实际用法:
import requests
from time import sleep
def get_ip():url='获取代理ip的地址'while True:response=requests.get(url)if response.text[0]=='{':print('提取失败')continuesleep(1)return response.text
def get_douban():headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}ip=get_ip()proxies = {'http': ip,'https':ip}response=requests.get('https://movie.douban.com/top250',headers=headers, proxies=proxies)print(response)
if __name__ == '__main__':get_douban()
2、selenium使用代理ip
from selenium.webdriver import Chrome,ChromeOptions
# 1、添加配置对象
options = ChromeOptions()
# 2、添加配置
options.add_argument('--proxy-server=http://代理ip')
# 3、通过指定配置创建浏览器对象
b=Chrome(options=options)
b.get(url) # url是我们需要访问的网址