爬虫笔记2019-08-07

1 字符串和二进制之间的相互转换

    字符串转化为二进制:encode() 默认为utf8,若为gbk需要注明

    二进制转化为字符串:decode() 默认为utf8,若为gbk需要注明

2 url规范:

    只能由特定字符组成,字母、数字、下划线,如果出现其他字符(中文、空格等)就要对其进行编码

3 urllib.response

    read()      读取相应的内容,内容是字节类型

    geturl()    读取请求的url

    getheaders() 读取头部信息,列表中元素有元组

    getcode()    获取状态码

    readlines()  按行读取,返回列表,内容为字节类型

4 urllib.parse

    quote()      url编码函数,将中文进行转化为%XXX

    unquote()    url解码函数,将%XXX转化为指定字符

    urlencode()  给一个字典,将字典拼接为query_string,并且实现了编码

5 UA(user agent)用户代理

    是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。

    它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。

    通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;

    例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的UA来判断的。UA可以进行伪装。

6 构建请求头部信息(反爬虫第一步)

    伪装自己的UA.让服务器认为是浏览器在上网

    构建请求对象:urllib.request.Request(参数需要提供url和伪装UA后的请求)

7 Ajax(Asynchronous Javascript And XML)

    一种创建交互式网页应用的网页开发技术,用于创建快速动态网页的技术

8 URLError\HTTPError异常处理 try-except

    URLError:

        (1):没有网

        (2):服务器连接失败

        (3):找不到指定的服务器

    HTTPError:

        是URLError的子类

    注:两个同时捕获的时候,需要将子类错误放在前面

9 Handler处理器、自定义Opener

    urlopen()  给定一个url,发送请求,获取响应

    Request()  定制请求头,创建请求对象

    高级功能    使用代理,使用cookie

10 代理:

    生活中的代理:微商、代驾

    程序中的代理

        正向代理    顺着请求的方向去进行的代理,替客户端去请求目标服务器地址(爬虫关注)获取数据

        反向代理    代理目标服务器提供数据

    配置:

        浏览器配置:设置-高级-系统-打开代理设置-连接-局域网设置-代理服务器--输入ip和端口号

        代码配置:handler = urllib.request.ProxyHandler({'http': '123.163.97.59:9999'})

                  opener = urllib.request.build_opener(handler)

                  后续都使用opener.open方法去发送请求

11 cookie

    cookie是什么?

        http协议,无状态

        网站登录时候的问题,用来记录用户身份的

    模拟登陆

12 cookie登录

    # 创建一个cookiejar对象

    cj = http.cookiejar.CookieJar()

    # 通过cookiejar创建一个handler

    handler = urllib.request.HTTPCookieProcessor(cj)

    # 根据handler创建一个opener

    opener = urllib.request.build_opener(handler)

    再往下所有操作都是用opener.open方法去发送请求,因为这里带着cookie过去了

13 正则表达式解析

    为什么引入正则表达式?

        用来匹配一类具有相同规则的字符串(包含正则匹配和正则替换)

    规则

        单字符:

            . :除换行以外所有字符

            []:[a-w]匹配集合中任意一个字符

            \d:数字[0-9]

            \D:非数字

            \w:数字、字母、下划线、中文

            \W:非w

            \S:非空白字符

            \s:所有的空白字符

        数量修饰:

            *:任意多次 >=0

            +: 至少一次 >=1

            ?: 可有可无 0次或1次

            {m}:固定m次

            {m,n}:m-n次

        边界:

            \b

            \B

            $:以某某结尾

            ^:以某某开头

        分组:

            () 视为一个整体(ab){3}

            () 子模式\组模式 \1 \2

        贪婪模式

            .*? .+?(加个?反贪婪)

        re.I: 忽略大小写

        re,M:多行匹配

        re.S:单行匹配

        match\search\findall:从开头开始\从任意位置开始\匹配所有

        re.sub(正则表达式,替换内容,字符串)

    http://www.yikexun.cn/

    需求:

        爬取指定页面的标题和内容

        保存到html文件中,标题用h1,内容使用p即可

14 bs4

    BeautifulSoup

    需要将pip源设置为国内源,阿里源、豆瓣源、网易源等

    windows

        (1)打开文件资源管理器

        (2)地址栏上面输入%appdata%

        (3)在这里面新建一个文件夹 pip

        (4)在文件夹里面新建一个文件夹 pip.ini

        写如下内容

        [global]

        timeout = 6000

        index-url = https://mirrors.aliyun.com/pypi/simple/

        trusted-host = mirrors.aliyun.com

    依赖库bs4,lxml

    简单使用:

        说明:选择器,jquery

        from bs4 import BeautifulSoup

        使用方式:可以将一个html文档,转化为指定的对象,然后通过对象的方法或者属性去查找指定的内容

        (1)转化为本地文件:

            soup = BeautifulSoup(open('本地文件'),'lxml')

        (2)转化为网络文件:

            soup = BeautifulSoup('字符串类型或者字节类型','lxml')

    (1)根据标签名查找

        soup.a 只能找到第一个符合要求的标签(a代表连接)

    (2)获取属性

        soup.a.attrs 获取所有属性和值,返回一个字典

        soup.a.attrs['href'] 获取href属性 简写为soup.a['href']

    (3)获取内容

        soup.a.text

        soup.a.string

        soup.a.get_text

            若标签里还有标签,string结果为none,其他两个可以获取内容

    (4)find

        soup.find('a') 找到第一个符合条件的a

        soup.find('a', title='qing')

        soup.find('a', id='feng')

        soup.find('a', class_='du')(class为关键字,需加下划线)

        find方法不仅soup可以调用,普通的div对象也能调用,会去指定的div里面去查找符合要求的节点

        find找到第一个对象

    (5)find_all

        soup.find_all('a')

        soup.find_all(['a', 'b'])

        soup.find_all('a', limit=2) 限制前两个

    (6)select(得到的是一个列表)

        根据选择器选择指定的内容、

        常见的选择器:标签选择器、类选择器、id选择器、组合选择器、层级选择器、伪类选择器、属性选择器

        标签选择器  a

        类选择器    .dudu

        id选择器  #lala

        组合选择器  a, .dudu, #lala, .meme

        层级选择器  div .dudu #lala .meme .xixi 下面好多级

        伪类选择器  div > p > a >.lala 只能是下面一级

        属性选择器  input[name='lala']

        select选择器返回的永远是列表,需要通过下标提取指定的对象,然后获取属性和节点

        该方法也可以通过普通对象调用,找到都是这个对象下面符合要求的所有节点

15 xpath

    pip install lxml

    xml 可扩展标记语言,是用来存储和传输数据使用的。

    和html的不同的主要有两点:

        (1)html用来显示数据,xml是用来传输数据

        (2)html标签是固定的,xml标签是自定义的

    xpath用来在xml中查找指定的元素,它是一种路径表达式

    //: 不考虑位置的查找

    ./: 从当前节点开始往下查找

    ../: 从当前节点的父节点查找

    @: 选择属性

    实例:

    /bookstore/book 选择根节点bookstore下面所有直接子节点book

    //book  选取所有book

    bookstore//book 查找bookstores下面所有的book

    /bookstore/book[1]  bookstore下面的第一个book

    安装xpath插件

    启动和关闭插件 ctrl + shift + x

    属性定位

    //input[@id="kw"]

    //input[@class="btn self-btn bg s_btn"]

    层级定位

    索引定位(索引从1开始)

    //div[@id="head"]/div/div[2]/a[@class="toindex"]

    //div//a[@class="toindex"]  双斜杠代表下面所有的a节点,不管位置

    逻辑运算

    //input[@name="wd" and @class="s_ipt"]

    模糊匹配

    contains

        //input[contains(@class, "s_i")]    所有的input,有class属性,并且属性中带有s_i的节点

        //input[contains(text(), "测试")]

    starts-with

        //input[starts-with(@class, "s_i")] 所有的input,有class属性,并且属性中以s开头的节点

    取文本

        //div[@id="u_sp"]/a[5]/text()  获取节点内容

        //div[@id="u_sp"]//text()  获取节点里面不带标签的所有内容

        直接将所有内容拼接起来返回给你

        ret = tree.xpath('//div[@class="song"]')

        string = ret[0].xpath('string(.)')

        print(string.replace('\n', '').replace('\t', ''))

    取属性

        //div[@id="u_sp"]/a[5]/@href

    代码中使用xpath

        from lxml import etree

        两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点

        (1)本地文件

            tree = etree.parse(文件名)

        (2)网络文件

            tree = etree.HTML(网页字符串)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容