学爬虫的第二天

学习的内容:(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注册过),当你登进时网站会提醒你填写手机号码,这里一定要填写!非常重要!因为要是你没填写,那么在账号里你就设置不了密码了(因为需要密保手机),那么后期学 Cookie 时就用不了 账号 + 密码 登入了(血的教训,最后我又新注册了一个账号才成功的),但如果你自己有账号和密码当我没说

人人网 大鹏董成鹏 的主页

F12找到profile文件中的CookieUser-Agent,并将它们写在请求头(header)中

找到 Cookie 和 User-Agent

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

下载到本地的主页

但是这样未免太过于人性化了,我们要做的爬虫自动化爬取,也就是从登入页面开始,就让它模拟人工登入,再进入目标页面进行爬取,因此我们引入下面两个可以自动爬取并携带 cookie 信息的库和函数

学习的内容:(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)

一开始我们处于人人网的登入页面。先创建一个可以携带 cookie 信息的 openercookie 信息就相当于你的个人登入信息,然后我们再建立一个请求头用于请求登入,并将请求成功的结果在 opener 中打开(代替urlopen),这样 cookie 信息就能储存在 opener 中(就不用再次登入了),然后再建立一个请求头用于请求访问目标页面(大鹏董成鹏的主页),依然用刚刚的 opener 打开,这样显示的就是我们需要的网页(html)了,最后保存到本地即可

小补充:登入界面第一行可以填邮箱,也可以填手机号码

人人网的登入页面

学习的内容: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/>

实现的功能是保存和加载 cookie 信息,一开始先保存 cookie 信息到本地(取消注释 保存那一行,并注释 加载那一行),运行代码后 cookie 信息就已经储存到了本地,需要加载的时候(取消注释 加载那一行,并注释 保存那一行)直接用即可,避免了重新 request 申请登录再获取 cookie 信息这一系列麻烦操作

获取的 cookie 信息

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

页面的 cookie 信息

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容