学习的内容:(urllib.request库)ProxyHandler
from urllib import request
url = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read()) # 我电脑的ip地址
handler = request.ProxyHandler({"http": "1.196.118.86:22753"})
opener = request.build_opener(handler)
resp = opener.open(url)
print(resp.read()) # 刚买的ip地址
打印如下(第一个是我电脑 ip,第二个是我刚买的 ip):
b'{\n "origin": "223.73.73.116"\n}\n'
b'{\n "origin": "1.196.118.86"\n}\n'
实现的功能是返回当前使用的 ip 地址(电脑本地或者代理商)
推荐一个可以返回当前使用 ip 的 网址
再推荐一个我购买 ip 的网站:快代理
实战的内容:爬取 人人网 大鹏董成鹏 的页面
from urllib import request
url = 'http://www.renren.com/880151247/profile' # 他的主页
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
'Cookie':'anonymid=ki60rsecnzjv2i; depovince=GW; _r01_=1; JSESSIONID=abchZ6E_3vhs5g-87FEyx; taihe_bi_sdk_uid=17d5c8f8ab48bb81662c52bba071b89a; taihe_bi_sdk_session=a49af331942a2f45d1e5a0c301203981; ick_login=a6e61230-3485-4ccc-9031-1dd182f04d61; __utma=151146938.1227861565.1606834852.1606834852.1606834852.1; __utmc=151146938; __utmz=151146938.1606834852.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; ick=1bd369a3-a7f5-468e-8699-d04b67375b55; first_login_flag=1; ln_uact=13727077344; ln_hurl=http://hdn.xnimg.cn/photos/hdn521/20201202/0000/h_main_qdJA_c64b0000abd0195a.jpg; jebecookies=a53c227b-439d-4845-b83c-e17a49d8dab1|||||; _de=457D48AAA63E58FEB68784D5AEB12133; p=f69ccadc0791d450c2b13b329314573d3; t=54064812cdc203e258b78c3bcc8639843; societyguester=54064812cdc203e258b78c3bcc8639843; id=975477223; xnsid=de687d14; loginfrom=syshome'
}
req = request.Request(url=url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
先要登进去,但这里提示一下,因为人人网目前是处于无人维护的状态,所以是注册不了的,只能使用微信或者QQ登进(即使你没有用微信或QQ注册过),当你登进时网站会提醒你填写手机号码,这里一定要填写!非常重要!因为要是你没填写,那么在账号里你就设置不了密码了(因为需要密保手机),那么后期学 时就用不了 账号 + 密码 登入了(血的教训,最后我又新注册了一个账号才成功的),但如果你自己有账号和密码当我没说

按找到
文件中的
和
,并将它们写在请求头(
)中

运行代码即可获取 人人网 大鹏董成鹏 的主页()

但是这样未免太过于人性化了,我们要做的爬虫自动化爬取,也就是从登入页面开始,就让它模拟人工登入,再进入目标页面进行爬取,因此我们引入下面两个可以自动爬取并携带 信息的库和函数
学习的内容:(urllib.request库)HTTPCookieProcessor 和 http.cookiejar 的 CookieJar 库
from urllib import parse
from urllib import request
from http.cookiejar import CookieJar
# 不用再写入目标网页的 cookie 信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}
# 创建一个可携带 cookie 信息的 opener
def get_opener():
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
return opener
# 将请求数据放入 opener 中完善,并登入以储存信息
def login_renren(opener):
data = {
'email': '13727077344', # 输入的是电话号码
'password': '' # 密码不告诉你嘿嘿
}
login_url = 'http://www.renren.com/PLogin.do'
req = request.Request(login_url, data=parse.urlencode(
data).encode('utf-8'), headers=headers)
opener.open(req)
# 登入目标主页爬取信息,并保存到本地
def visit_profile(opener):
dapeng_url = 'http://www.renren.com/880151247/profile'
req = request.Request(dapeng_url, headers=headers)
resp = opener.open(req)
with open('renren.html', 'w', encoding='utf-8',) as fp:
fp.write(resp.read().decode('utf-8'))
# 轮流调用三个函数
if __name__ == "__main__":
opener = get_opener()
login_renren(opener)
visit_profile(opener)
一开始我们处于人人网的登入页面。先创建一个可以携带 信息的
,
信息就相当于你的个人登入信息,然后我们再建立一个请求头用于请求登入,并将请求成功的结果在
中打开(代替
),这样
信息就能储存在
中(就不用再次登入了),然后再建立一个请求头用于请求访问目标页面(大鹏董成鹏的主页),依然用刚刚的
打开,这样显示的就是我们需要的网页(
)了,最后保存到本地即可
小补充:登入界面第一行可以填邮箱,也可以填手机号码

学习的内容:http.cookiejar 的 MozillaCookieJar 库
from urllib import parse
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load(ignore_discard=True) # 加载
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://httpbin.org/cookies/set?course=spider')
# cookiejar.save(ignore_discard=True) # 保存
for cookie in cookiejar:
print(cookie)
打印如下:
<Cookie course=spider for httpbin.org/>
实现的功能是保存和加载 信息,一开始先保存
信息到本地(取消注释 保存那一行,并注释 加载那一行),运行代码后
信息就已经储存到了本地,需要加载的时候(取消注释 加载那一行,并注释 保存那一行)直接用即可,避免了重新
申请登录再获取
信息这一系列麻烦操作

有个需要注意的地方,如果需要获取的 信息是及时关闭的(当关闭当前网站后
信息就会随即消失),如下图所示:

那么就需要在 或
函数中加入 ignore_discard=True,表示及时获取