python爬虫urllib cookie登陆和handler

目录

1.cookie登录

2.urllib_handler处理器 

2.1 handler处理器的基本使用

2.2 代理服务器 

 2.3 代理池


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)

 

### 回答1: 可以使用urllib库中的HTTPCookieProcessor和urllib.request.build_opener()方法来自动保存cookie。 具体步骤如下: 1. 导入urllib库中的HTTPCookieProcessor和urllib.request.build_opener()方法。 2. 创建一个CookieJar对象,用于保存cookie。 3. 创建一个HTTPCookieProcessor对象,并将CookieJar对象作为参数传入。 4. 使用urllib.request.build_opener()方法创建一个opener对象,并将HTTPCookieProcessor对象作为参数传入。 5. 使用opener对象发送请求,自动保存cookie。 示例代码如下: import urllib.request import http.cookiejar # 创建一个CookieJar对象,用于保存cookie cookie_jar = http.cookiejar.CookieJar() # 创建一个HTTPCookieProcessor对象,并将CookieJar对象作为参数传入 cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar) # 使用urllib.request.build_opener()方法创建一个opener对象,并将HTTPCookieProcessor对象作为参数传入 opener = urllib.request.build_opener(cookie_processor) # 使用opener对象发送请求,自动保存cookie response = opener.open('http://www.example.com') # 打印cookie for cookie in cookie_jar: print(cookie) ### 回答2: Python 是一种高级编程语言,非常适合进行网络数据爬取和处理。而在 Python 爬虫中,urllib 是一个重要的库,可以帮助我们轻松实现网页数据的请求和处理。 在进行 Python 爬虫开发时,有时需要保存 cookie ,以便之后再次使用,这在从网站中获取数据时非常有用。为了自动保存 cookie ,可以在 urllib 中使用 Request 类中的 http.cookiejar.CookieJar() 对象。 下面是一份用 Python 编写自动保存 cookie 的示例代码: ```python import urllib.request, http.cookiejar cookiejar = http.cookiejar.CookieJar() cookie_support = urllib.request.HTTPCookieProcessor(cookiejar) opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler) urllib.request.install_opener(opener) # 发送请求,并保存 cookie 信息 response = urllib.request.urlopen('http://www.baidu.com') for cookie in cookiejar: print('Name: ' + cookie.name) print('Value: ' + cookie.value) print('Host: ' + cookie.domain) print('Path: ' + cookie.path) # 保存 cookie 到文件 filename = 'cookie.txt' cookiejar.save(filename, ignore_discard=True, ignore_expires=True) ``` 在上面的代码中,首先创建了一个 CookieJar 对象,并将其作为参数传递给了 HTTPCookieProcessor 对象,然后使用 build_opener() 方法将其与 HTTP 请求处理器结合起来,并将其安装到全局 urllib.request 中。接下来,通过 urlopen() 方法向百度发送请求,并将返回的 cookie 信息保存到 CookieJar 对象中。最后,使用 save() 方法将 cookie 信息保存到 cookie.txt 文件中,并将 ignore_discard 和 ignore_expires 参数都设置为 True,以保证保存所有的 cookie 信息。 通过使用上述代码,我们可以轻松实现 Python 爬虫自动保存 cookie 的功能。同时,如果在后续的爬虫开发中需要使用之前保存的 cookie ,只需要将其从文件中读取并加载到 CookieJar 对象中即可。 ### 回答3: 在进行Python爬虫开发时,经常需要使用到urllib库来发送http请求。而使用urllib库发送的请求需要携带cookie,否则很多网站并不会认为用户已经登录,这样就会导致后续的操作受到限制。因此,在Python编写爬虫程序时,自动保存cookie就显得非常重要了,这样可以帮助我们实现更高效、稳定的爬虫程序。 首先,我们需要在Python中使用urllib库发送http请求获取cookie,这可以通过代码如下实现: ``` import urllib.request import http.cookiejar def get_cookie(): # 创建cookie实例 cookie = http.cookiejar.CookieJar() handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 输出得到的cookie for item in cookie: print(item.name + "=" + item.value) ``` 上述代码使用了Python中内置的cookiejar库来创建一个cookie实例,并使用HTTPCookieProcessor来处理发送请求时所携带的cookie。最后我们可以使用for循环来遍历返回的cookie。 当然,如果我们需要将cookie保存下来,稍作处理,方便后续的使用,我们可以对上述代码进行一定的修改,如下: ``` import urllib.request import http.cookiejar def save_cookie(): filename = 'cookie.txt' # 创建MozillaCookieJar实例 cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 保存cookie到文件 cookie.save(ignore_discard=True, ignore_expires=True) ``` 在上述代码中,我们在创建cookie实例时,使用了MozzillaCookieJar,这是一个专门用于保存cookie的对象,它可以直接将cookie保存到文件中。在进行cookie保存时,我们可以忽略掉cookie过期的时间,以及当窗口关闭时cookie是否自动清除的属性。最后,我们可以使用cookie.save()函数直接将cookie保存到文件中。 除了上述的方法,我们还可以在cookie文件中查找到需要用到的cookie值,这可以通过如下代码实现: ``` import urllib.request import http.cookiejar def load_cookie(): filename = 'cookie.txt' # 创建MozillaCookieJar实例 cookie = http.cookiejar.MozillaCookieJar() cookie.load(filename, ignore_discard=True, ignore_expires=True) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) # 发送请求 response = opener.open('http://www.example.com') # 输出返回的结果 print(response.read().decode('utf-8')) ``` 上述代码中,我们可以通过调用cookie.load()函数,从之前保存的cookie文件中读取出cookie数据,然后使用HTTPCookieProcessor来处理发送请求时所携带的cookie,并使用build_opener创建对应的opener对象,以访问目标网站。最后我们可以通过response.read()方法得到服务器返回的结果,然后进行后续处理。 总的来说,自动保存cookie可以帮助我们更加轻松、高效地使用Python进行爬虫开发,同时也可以提高爬虫程序的稳定性。如果我们能够正确地使用上述方法,相信自动保存cookie爬虫程序开发中将会发挥不可替代的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值