• 路飞学城Python爬虫课第一章笔记


    前言

    原创文章,转载引用务必注明链接。水平有限,如有疏漏,欢迎指正。

    之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频。

    缴纳99元保证金即可参与,只要完成3次作业和参与直播,提交学习笔记,就可以退还保证金,还可获得《Python全栈开发实战》及内部教材书籍,视频课程、定制文化衫等作为奖励。另外,还会有1对1的导师逐行批改你的代码、讲师3次直播答疑,还有班主任组队小伙伴共同学习。

    好像打了一次广告,麻烦luffy的工作人员看到给我打个赏。网站做的还可以,7月3号正式开课,现在先看的录播,讲的内容还行,但是看视频嘛,有时候会有闲扯。

    本文环境:Windows_7_64 bit, Visual Studio Code + Code Runner(Ctrl + Alt + N), Python 3.6,

    1、章节一 初始爬虫笔记

    • r.encoding = r.apparent_encoding 设置编码为网页指定的编码,防止乱码(主要utf-8、gbk等)

          >>> import requests
        >>> r = requests.get('http://baidu.com')
        >>> r.apparent_encoding
        'ascii'
        >>> r = requests.get('http://www.baidu.com')
        >>> r.apparent_encoding
        'utf-8'
      
    • from xx import xxx 与import xx的区别

      >>> from requests_html import HTMLSession
      >>> session = HTMLSession()
      # 或者
      >>> from requests_html import HTML as XXX
      >>> doc = """<a href='https://httpbin.org'>"""
      >>> html = HTML(html=doc)
      

      直接使用模块内的功能(?),否则就是requests_html.HTML()

    • BeautifulSoup(r.txet, 'html.parser') # lxml快但不内置, 需要手动pip安装

    • 出现None时回看数据,必要时跳过

      for li in li_list:
        h3 = li.find(name='h3')
        if not h3:
          continue
         print(ht.text)
      
    • BeautifulSoup find()查找第一个获取包含所有内容的div,返回对象;然后再次find_all()查找每个内容的最小个体,返回列表

    • 借助chrome的调试控制台,主要是network、element等,选择element,往上找到带id的。

    • r.find()和r.find_all()都返回列表,前者只有一个元素

    以上为爬取汽车之家,以下为登录抽屉点赞:

    • bugmenot.com查看共享账号

    • 首先随便输入信息,在f12中Network中看到Login过程

    • F12选择左上角关闭DeviceBar可以扩大显示空间

    • 直接看json()显示为none,重新看text发现启用反爬虫,设置User-Agent OK。一般需要的就是Hots防盗链,User-Agent防爬虫,先啥都不加

    • 获取cookies:r.cookies.get_dict()

    • 对于https,fiddler需要安装证书解密,直观。F12也很强大,就是乱

    • 有些网站是初次未登录时获取cookies,登陆后对该cookies授权

    • 对于form传递,有csrf或者token的,先访问页面获取token,然后带着token传递账密

    • s.attrs显示属性,返回字典。s.get('value')取某个属性的值

    • ☆使用selector时有时候是全局,比如找在info里面用复制的selector找不到,res里可以找到。此外,登录前登陆后复制的selector可能不同,主要是前体

    • 登录github时,获取页面text报错:

      UnicodeEncodeError: 'gbk' codec can't encode character 'u21b5' in position 10332: illegal multibyte sequence

      考虑非法字符串无法转换,对string重编码:r.text.decode('utf-8')

    • 要会web才学好爬虫

    • network -xhr请求-ajax请求

    • Preserve log,Disable cache

    • 重定向保存,update cookie, allow_rediect = False
      重定向 302 Location响应头:r3.headers['Location']

    • 初起学习尽量不要用session,先手动模拟,搞透调通再用自动化完成

    2、爬虫作业 登录github获取个人信息

    课上讲了一部分,登录方式如下,这里我们用session自动管理cookies:

    # -*- coding: utf-8 -*-
    
    import requests
    from bs4 import BeautifulSoup
    # from lxml import etree
    from requests_html import HTML
    
    # session = HTMLSession()
    r = requests.session()
    
    username = 'username'
    passwd = 'passwd'
    s1 = BeautifulSoup(r.get('https://github.com/login').text, 'html.parser')
    # print(s1)
    token = s1.find(name='input', attrs={'name': 'authenticity_token'}).get('value')
    # print(token)
    
    FormData = {
        'commit': 'Sign in',
        'utf8': '✓',
        'authenticity_token': token,
        'login': username,
        'password': passwd
    }
    
    r.post('https://github.com/session', data=FormData)
    

    此时已经登录github。访问个人主页获取信息:

    res = BeautifulSoup(r.get('https://github.com/' + username).text, 'html.parser')
    info = res.select('#js-pjax-container > div > div.h-card.col-3.float-left.pr-3')[0]
    
    avatar_src = info.find('img').get('src')
    name = info.find(name='span', attrs={'itemprop': 'name'}).text
    additionalName = info.find('span', attrs={'itemprop': 'additionalName'}).text
    
    print('name is {0}, additionalName is {1}, avatar is {2}'.format(name, additionalName, avatar_src))
    

    直接是值的话就是.text,否则就是get('value')获取。我们使用vsc配合code runner可以看到运行时间,还有其他功能,非常好用。获取大头像地址去掉?s=64

    输出字符乱码的解决

    关于输出字符编码乱码,发现用VSC有,IDLE没有,和IDE有关系。建议看以下文章:

    以上是基础,参考

    在visual studio code 中配置python以及解决中文乱码问题,添加以下代码(Windows/Linux测试通过):

    # -*-coding:utf-8 -*-
    import io
    import sys
    #改变标准输出的默认编码
    sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
    

    采用修改环境变量的方法可以一劳永逸,PYTHONIOENCODING=UTF8,Windows可以借助Rapidee,linux则export PYTHONIOENCODING=UTF8即可临时实现,具体可以修改.bashrc文件。

    参考链接

  • 相关阅读:
    通过this调用本类属性和本类方法
    使用构造方法接收引用数据类型
    JAVA回形数
    Bt(宝塔面板)忘记用户名密码的解决方案
    关于xshell远程连接密码呈现灰色无法填写的问题
    ubunt系统创建定时任务
    阿里云服务器如何初始化
    解决laravel 配置路由时除 “/”路由 以外 ,所有路由访问不到的情况
    laravel 5.2 使用 captcha 实现 验证码
    在laravel中如何使用事务
  • 原文地址:https://www.cnblogs.com/sjqlwy/p/luffy_python_web_1.html
Copyright © 2020-2023  润新知