目录
1.cookie登录
适用于数据采集的时候,需要绕过cookie登录,然后进入到某个页面
个人信息页面是utf-8,但是还报错了编码错误,因为并没有进入到个人页面,而是跳转到了登陆页面,而登陆页面不是utf-8
请求头的信息不够,所以会登陆不成功
import urllib.request
url = 'https://weibo.com/u/7624653476'
headers = {
'Cookie':'XSRF-TOKEN=kzYOgkJBlFEkYZkvwf7Gs0FY; SSOLoginState=1687097509; _s_tentry=weibo.com; Apache=7462304662206.001.1687097859328; SINAGLOBAL=7462304662206.001.1687097859328; ULV=1687097859469:1:1:1:7462304662206.001.1687097859328:; PC_TOKEN=1cd641980f; WBPSESS=FG2_UEiPqJ2epc1gDTscdWv_euEc1x4CxfcACg4FXqkCUwg8dghq9iux0tApvVVkyJVzqrdIb1PAXqEFDAdrU7p8HK3ZmEPCI_3bq-IK4qD7fQ_0QdT5iPrjkXR9CUnJV3otoWZHAi7XHCkcMc9Ebg==; SCF=Ap3abs7_PvObBwrvoADjIXBACy_y-fyS3YmWW6odJ2haxcU_Dxv_9pKeO9xjBuqoUe9FTPdZtfCZRq7Z7r6z4z0.; SUB=_2A25Ji2PrDeRhGeFI6VYX9S3IzDqIHXVq4dIjrDV8PUNbmtANLWzikW9NfShwFW8E9RtG8MTjjuBnkS0ZC-czYfNO; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWFxIccg5iwx8L35ArmEJkS5JpX5KMhUgL.FoMceoBcSKeXS0q2dJLoIpXLxKBLBonL12BLxKqL1h.L1KeLxKML1heL1227e5tt; ALF=1689690299',
'Referer':'https: // weibo.com / u / 7624653476'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open('weibo.html', 'w', encoding='utf-8') as fp:
fp.write(content)
这就是我个人微博信息页面的源码
cookie中携带着你的登陆信息 如果有登陆之后的cookie 那么我们就可以携带着cookie进入到任何页面
referer 判断当前路径是不是由上一个路径进来的 一般情况下 是做图片防盗链
这是两个比较重要的。
'accept':
'accept-encoding':
'accept-language':
'cache-control':
'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
这些属性不重要,就可以注释掉了
2.urllib_handler处理器
2.1 handler处理器的基本使用
urllib.request.urlopen(url)不能定制请求头
urllib.request.Request(url,headers,data)可以定制请求头
handler可以定制更加高级的请求头
第一天学的时候就爬过百度网页的源码,现在学着用handler重新爬
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
# handler build_opener open
# (1)获取hanlder对象
handler = urllib.request.HTTPHandler()
# (2)获取opener对象
opener = urllib.request.build_opener(handler)
# (3) 调用open方法
response = opener.open(request)
content = response.read().decode('utf-8')
print(content)
2.2 代理服务器
代理服务器的常用功能:
1.突破自身ip访问限制,访问国外节点
2.访问一些单位和集体的内部资源
3.提高访问速度
4.隐藏真实ip
代码配置代理1.创建request对象
2.创建proxyHandler对象
3.用handler对象创建opener对象
4.使用opener.open函数发送请求
import urllib.request
url = 'https://www.baidu.com/s?wd=ip'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
"cookie" : "BIDUPSID=D5B7B5DC9EC418BF086F8034419288FE; PSTM=1678029839; BAIDUID=D5B7B5DC9EC418BF5368CDA9BA195075:FG=1; BD_UPN=12314753; BDUSS=XZxTHVQbXVQUEtwdzZVQ3JqWmNzNXViR1RiSThYWnl3bWYtMEFzZTI0VzU0UzVrRVFBQUFBJCQAAAAAAQAAAAEAAADKzPFDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALlUB2S5VAdkZ; BDUSS_BFESS=XZxTHVQbXVQUEtwdzZVQ3JqWmNzNXViR1RiSThYWnl3bWYtMEFzZTI0VzU0UzVrRVFBQUFBJCQAAAAAAQAAAAEAAADKzPFDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALlUB2S5VAdkZ; MCITY=-307%3A; BAIDUID_BFESS=D5B7B5DC9EC418BF5368CDA9BA195075:FG=1; B64_BOT=1; BA_HECTOR=0k0ga585810g2g218l200l851i8lgf91p; ZFY=woKzUXT6SomN3BpQdFG:B3:AH80tsHyB8:Ajy7WZJ:AY1GU:C; COOKIE_SESSION=86716_3_8_8_5_19_1_2_5_8_0_9_86672_368_3_0_1686816164_1686728918_1686816161%7C9%23380_28_1686728915%7C9; BD_HOME=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1; PSINO=1; delPer=0; BDRCVFR[r5ISJbddYbD]=jgHDRC9lqMRmvPhuMC8mvqV; H_PS_PSSID=; channel=baidu.ccffz.com; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=ala; ab_sr=1.0.1_MDM4ZWY2MzJkMjRmZGU4ZGY4MTIwODMwYjhkMTljNjRkZWFjMTEzMjk5OTU1ZDQ2OWVmYmNmNTFjNzBmOWU2YzkwMzNlMzMzMmQzNjlhMjI0MTM2MWFhZjkzODAxODFiM2QxODEzZmQzZTdjMDk1ZDk1YTY5YTAyNzk3MzczZTQ5NTJhYWNlNzc0MTJkM2M3Nzc0YWE1ZTBjNTNiMzBjOQ==; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; sugstore=1; H_PS_645EC=5c9bbTDHjVXQaHtU%2FtigrZipb92iS2HjtKe7%2BSUaEZyclekTNob55dKrYDsCLZM1Hf0JXrX6huYv; baikeVisitId=fc790598-fc71-4c38-8490-971425ae8a13"
}
request = urllib.request.Request(url=url, headers=headers)
proxies={
'http': '118.24.219.151:16817'
}
# (1)获取hanlder对象
handler = urllib.request.ProxyHandler(proxies=proxies)
# (2)获取opener对象
opener = urllib.request.build_opener(handler)
# (3) 调用open方法
response = opener.open(request)
content = response.read().decode('utf-8')
with open('daili.html', 'w', encoding='utf‐8') as fp:
fp.write(content)
proxies这里搜索快代理中的免费试用,复制了一些不能使用,所以我用老师视频里讲的。
2.3 代理池
使用一个ip频繁访问一个网站会被封,这就需要代理池
代理池指有一堆高密的ip地址
大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉。对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问;而对于访问次数,就需要使用代理 IP 来帮忙了,使用多个代理 IP 轮换着去访问目标网址可以有效地解决问题。
proxies_pool = [
{'http': '118.24.219.151:16817'},
{'http': '118.24.219.151:16817'},
]
import random
# 使其从代理池中任意选择一个IP
proxies = random.choice(proxies_pool)