Python进阶(四十五)走进requests库_beautiful is better than ugly(1)

文章介绍了如何使用requests库和BeautifulSoup解析技术从CSDN博客获取访问信息,包括粉丝数量,并演示了如何模拟登录过程。作者还提到Fiddler作为抓包工具的使用和Python在爬虫中的应用。
摘要由CSDN通过智能技术生成
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,\*/\*;q=0.8',
'Referer': 'http://write.blog.csdn.net/postlist/6788536/0/enabled/2',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',

}


有关请求头的获取,可使用浏览器自带的“开发者工具获取”或利用Fiddler工具,有关Fiddler的详细使用参见博文《[Fiddler(一) - Fiddler简介](https://bbs.csdn.net/topics/618166371)》、《[Fiddler(二) - 使用Fiddler做抓包分析](https://bbs.csdn.net/topics/618166371)》、《[Python进阶(三十五)-Fiddler命令行和HTTP断点调试](https://bbs.csdn.net/topics/618166371)》。


使用requests访问网站时语句特别简洁,如下:



#构造请求,访问页面
response = requests.get(myUrl,headers=headers)


其中,response即为访问返回结果。获取到结果之后requests的使用至此结束。然后就是使用bs4进行文档解析了。代码如下:



创建BeautifulSoup对象

response.encoding = ‘utf-8’
soup = BeautifulSoup(response.text, “html.parser”)


下面以获取博客访问信息为例,首先参照网页源码获悉页面元素布局。


![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/a7e0510d648d9730f76a7246a529b0fb.png)


bs4解析代码如下:



获取

    ul = soup.find(‘ul’, {‘id’: ‘blog_rank’})

    获取所有的li

    lists = ul.find_all(‘li’)

    对每个li标签中的内容进行遍历

    for li in lists:
    # 找到访问总量
    data = li.find(‘span’).string
    # print(type(data))
    if data is None:
    # http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/blog8.png
    src = dict(li.find(‘img’, {‘id’: ‘leveImg’}).attrs)[‘src’]
    # 52
    # print(src.index(‘blog’))
    # print(src[56])
    data = src[56]

    
    在获取等级时,需要进行特殊处理。
    
    
    ### 四、模拟登录
    
    
    在获取粉丝数量时,首先要模拟用户登录。
    
    
    采用python模拟登录CSDN的时候分为三步走:
    
    
    1. 获取url=https://passport.csdn.net/account/login;
    2. 分析登录信息:从网页中得到username,password和hideen标签隐藏的属性,在CSDN中有三个隐藏标签,lt,execution,\_eventId //注意这三个标签是动态的。同时注意到表单使用post提交方式。
    
    
    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/370b0ac7f6c74b2958094f965f25f6bc.png)
    
    
    3. 下面使用post方式实现表单提交操作,代码如下:
    
    
    
    

    import re
    import requests
    url = “https://passport.csdn.net/account/login”
    head = {
    “User-Agent”:“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36”,
    }
    Username = “***”
    PassWord = “***”
    s = requests.session()
    r = s.get(url,headers=head)
    lt_execution_id = re.findall(‘name=“lt” value=“(.*?)”.*\sname=“execution” value=“(.*?)”’, r.text, re.S)
    payload = {
    “username”: Username,
    “password”: PassWord,
    “lt” : lt_execution_id[0][0],
    “execution” : lt_execution_id[0][1],
    “_eventId” : “submit”
    }
    r2 = s.post(url,headers=head,data=payload)
    print(r2.text) #登录成功会返回一段loginapi.js的脚本
    print(“*”*100) #分隔符
    r3 = s.get(“http://my.csdn.net”,headers=head)
    print(r3.text) #成功获取"我的主页"源代码

    
    程序运行结果如下:
    
    
    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/bfc5de9efd38ba0e56466920bd71bdcf.png)  
     ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/1af88259a9f2c46a152bc357d5596e82.png)
    
    
    ### 五、bs4解析
    
    
    接下来使用bs4解析出粉丝数量及个人信息。
    
    
    
    

    def craw_csdn(self, response):
    # 创建BeautifulSoup对象
    response.encoding = ‘utf-8’
    soup = BeautifulSoup(response.text, “html.parser”)
    # 按照标准的缩进格式的结构输出
    # print(soup.prettify())
    # 获取body部分
    body = soup.body
    #

    5关注

    focus = soup.find(‘dd’, class_=‘focus_num’).find(‘a’).string
    print(“关注:” + str(focus))
    #
    1374粉丝

    fans = soup.find(‘dd’, class_=‘fans_num’).find(‘a’).string
    print(“粉丝:” + str(fans))
    #
    # ***
    nick_name = soup.find(‘dt’, class_=‘person-nick-name’).find(‘span’).string
    print(“昵称:” + str(nick_name))
    #

    # 计算机软件 |研究生 |*** |中国-**省-**市 |男 |19**11-11

    #
    No Silver Bullet.

    person_detail = soup.find(‘dd’, class_=‘person-detail’).contents
    # print(len(person_detail))
    len_person_detail = len(person_detail)
    pd = []
    #代表从0到5,间隔2(不包含5)
    for i in range(0,len_person_detail,2):
    # print(person_detail[i])
    if i == 0:
    pd.append(person_detail[i].lstrip(’ \n \t\t’))
    else:
    pd.append(person_detail[i])
    print(“个人信息:” + str(pd))
    return int(fans)

    
    爬取结果如下图所示:
    
    
    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/abb67cdd411341c9d1481ff30fc6e2c0.png)
    
    
    ### 六、总结
    
    
    以上实现了利用`requests`结合bs4获取博客信息,同时实现了模拟用户登录获取粉丝数量,至于具体采集应用大家就请自行发挥吧。有关`requests`及`bs4`的其他具体应用详见参考资料。
    
    
    ### 七、string查找 && range
    
    
    #### 7.1 string查找
    
    
    `python`的`string`对象没有`contains`方法,不用使用`string.contains`的方法判断是否包含子字符串,但是`python`有更简单的方法来替换contains函数。
    
    
    方法1:使用 `in` 方法实现`contains`的功能:
    
    
    
    

    site = ‘http://www.jb51.net/’
    if “jb51” in site:
    print(‘site contains jb51’)

    
    输出结果:site contains jb51
    
    
    ### 最后
    
    四轮技术面+一轮hr面结束,学习到了不少,面试也是一个学习检测自己的过程,面试前大概复习了 一周的时间,把以前的代码看了一下,字节跳动比较注重算法,面试前刷了下leetcode和剑指offer, 也刷了些在牛客网上的面经。大概就说这些了,写代码去了~
    
    
    
    祝大家都能收获大厂offer~
    
    > **[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**
    
    **篇幅有限,仅展示部分内容**
    
    ![](https://img-blog.csdnimg.cn/img_convert/ac0b1c2376da47d727e0dc8a77e76478.png)
    
    
    
    ![](https://img-blog.csdnimg.cn/img_convert/b871b45fb2e6d5442144c863cbcff965.png)
    
    ![](https://img-blog.csdnimg.cn/img_convert/f5c18f4b2878302f1f53a8c393e7eb0d.png)
    
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值