zoukankan      html  css  js  c++  java
  • Scrapy 基础

    1.requests 安装:
    -pip install requests
    确认requests是否安装成功
    -import requests
    eg :
    -import requests
    r = requests.get("htpp://www.baidu.com")# 获取百度
    r.status_code #状态码
    返回值 :200 说明 请求成功
    t.encoding = 'utf-8'
    t.text #打印百度的html网页的代码
    --
    html 代码
    --
    2.get方法:
    r =requests.get(url)
    request.get(url,params=None, **kwargs)
    url: 拟获取页面的url的链接,
    params: url中的额外参数,字典或字节流格式,可选
    ** kwargs 可选的

    3.Response 对象:
    -属性:
    r.status_code:http请求的返回状态,200表示链接成功, 404表示连接失败
    t.text; http响应内容的字符串形式, 即, url对应的页面内容
    r.encoding:从http header中猜测的响应内容编码方式,
    r.apparent_encoding: 从内容分析出的响应内容编码方式(备选编码方式)
    r.content :http响应内容的二进制形式

    4.requests库的异常:
    requests.ConnectionError:网络连接错误异常,如DNS查询失败,拒绝链接等
    requests.HTTPError:HTTP错误异常
    requests.URLRequired:URL缺失异常
    requests.TooManyRedirects:超过最大重定向次数,产生重定向异常
    requests.ConnectTimeout:链接远程服务器超时异常
    requests.Timeout:请求URL超时, 产生超时异常
    r.raise_for_status():如果是200, 产生异常requests.HTTPError
    -爬取网页的通用代码的框架:
    import requests
    def getHTMLText(url):
    try:
    r = requests.get(url, timeout=30)
    r.raise_for_status()#如果状态不是200, 引发HTTPError异常
    r.encoding = r.apparent_encoding
    return r.text
    except:
    return "产生异常"

    if __name__=="__main__":
    url="http://www.baidu.com"
    print(getHTMLText(url))

    requests库的head()方法:
    r=requests.head("http://httpbin.org/get")
    r.headers
    requests库的post()方法:
    payload={'key1':'value1', 'key2':'value2'}
    r = requests.post("http://httpbin.org/post", data=payload)
    print(r.text)

    5.Requests 库的7个方法:
    requests.request():构造一个请求,支撑以下各个方法的计出方法
    requests.get():获取HTML网页的主要方法, 对应HTTP的GET
    requests.head():获取HTML网页头信息的方法, 对应于HTTP的HEAD
    requests.post():向html网页提交post请求的方法, 对应HTTP的POST
    requests.put():向html网页提交PUT请求的方法, 对应HTTP的PUT
    requests.patch():向html网页提交局部修改请求, 对应HTTP的PATCH
    requests.delete():向html页面提交删除请求,对应于HTTP的DELETE

    requests.request(method, url, **kwargs)
    -method:请求方式, 对应get/post/put等7种
    -url:拟获取网页的url链接
    **kwargs:控制访问的参数,共13个

    -13个参数:
    --params:字典或者序列, 作为参增加到url中
    kv={'key1':'value1', 'key2':'value2'}
    r = requests.request("GET", 'http://python123.io/ws', params=kv)
    print(r.url)
    返回值
    ----
    >>>https://python123.io/we?key1=value1&key2=value2
    -----
    --data:字典, 字节序列或文件对象, 作为Request的内容
    kv={'key1':'value1', 'key2':'value2'}
    r = requests.request("GET", 'http://python123.io/ws', data=kv)
    body='主体内容'
    r = requests.request("POST", 'http://python123.io/ws', data=body)
    --json:json格式数据,作为Request的内容
    kv = {'key1':'value1'}
    r=requests.request('POST', 'http://python123.io/ws', json=kv)
    --headers:字典, http定制头
    hd={'user-agent':'Chrome/10'}
    r=requests.request('POST', 'http://python123.io/ws', headers=hd)
    --cookies:字典或CookieJar, Request中的cookie
    --auth:元组, 支持HTTP认证功能
    --file:字典类型,传输文件
    fs = {'file':open('data.xls','rb')}
    r = requests.request('POST', 'http://python123.io/ws', file=fs)
    --timeout:设定超时时间,秒为单位
    r = requests.request('GET', 'http://python123.io/ws',timeout=10)
    --proxies:字典类型, 设定访问代理服务器, 可以增加登录认证
    pxs = {'http':'http://user:pass@10.10.10.1:1234'
    'https://10.10.10.1:4321'
    }
    r=requests.request('GET','http://www.baidu.com', proxies=pxs)
    --allow_redirects:True/False, 默认为True, 重定向开关
    --stream:True/False, 默认为True, 获取内容立即下载开关
    --verify:True/False, 默认为True, 认证SSL证书开关
    --cert:本地SSL证书路径

    Robots协议:
    Robots Exclusion Standard 网络爬虫排除标准
    作用:网站告知网络爬虫那些页面可以抓取, 那些不行
    形式:在网站的根目录下
    --Robots协议的使用:
    网络爬虫:自动或人工识别robots.txt, 在进行内容爬取
    --约束性:Robots协议是建议但非约束性, 网络爬虫可以不遵守, 但是存在法律风险

    ---图片下载与保存:

    import requests
    r=requests.get(url)
    with open(path, 'wb') as f:
    f.write(r.content)
    =================================
    IP地址的查询:------
    -----------------------
    import requests
    url = 'http://m.ip138.com/ip.asp?ip='
    try:
    r = requests.get(url+'202.204.80.112')
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text)
    except:
    print('爬取失败!')

    ===============
    -------------------------
    beautifulsoup4的安装:
    -pip install beautifulsoup4
    BeautifulSoup测试:
    -----------------------
    import requests
    r=requests.get('http://python123.io/ws/demo.html')
    print(r.text)
    demo=r.text
    from bs import BeautifulSoup
    soup = BeautifulSoup(demo, 'html.parser')
    print(soup.prettify())
    =======================
    6. BeautifulSoup 库的理解
    =======================
    --解析,遍历,维护,"标签树"的功能库
    ==Beautiful Soup 类的基本元素
    --Tag:标签, 最基本的信息组织单元, 分别用<>和</>标明开头和结尾
    --Name:标签的名字,<p>……</p>的名字是'p', 格式:<tag>.name
    --Attributes:标签的属性, 字典形式组织, 格式:<tag>.attrs
    --NavigableString:标签内非常属性字符串,<>…</>中字符串吗格式:<tag>.string
    --Comment:标签内字符串的注释部分, 一种特殊的Comment类型
    ==标签树的下行遍历
    .content:子节点的列表, 将<tag>所有儿子节点存入列表
    .children:子节点的迭代类型,与.content类似, 用于循环遍历儿子节点
    .descendants:子孙节点的迭代类型,包含所有的子孙节点,用于循环遍历
    ==标签树的上行遍历
    .parent:节点的父亲标签
    .parents:节点先辈标签的迭代类型,用于循环遍历先辈节点
    ==标签树的平行遍历
    .next_sibling:返回按照HTML文本顺序的下一个平行节点标签
    .previous_sibling:返回按照HTML文本顺序的上一个平行节点标签
    .next_siblings:迭代类型, 返回按照HTML文本顺序的后续所有平行的节点
    .previous_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

    ========
    .prettify()

    ========

    --信息标记的三种形式:
    --信息的标记:
    --标记后的信息可形成信息组织结构,增加信息维度
    --标记后的信息可用于通信、存储或展示
    --标记的结构与信息一样具有重要的价值,
    --标记的信息更利于程序的理解胡运用
    =====
    HTML知识: …………
    Xml 信息标记语言
    json:有类型的键值对 (key:value)
    YAML:无类型的键值对 (没有双引号"")
    --"|" 表达整块数据 # 表注释

    =====
    信息提取的一般方法:
    方法一:
    完整解析信息的标记形式,在提取关键信息
    XML JOSN YAML
    需要标记解析器, 例如:bs4的标签树的遍历
    方法二:
    五十标记形式, 直接搜索关键信息
    搜索
    ---对信息的文本查找函数即可,
    优点:提取过程简洁,速度较快
    缺点,提取结果准确性与信息内容相关
    ========
    代码: =
    ========================================================
    import requests
    r=requests.get('http://python123.io/ws/demo.html')
    print(r.text)
    demo=r.text
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(demo, "hrml.parser")
    for link in soup.find_all('a'):
    print(link.get('href'))
    =========================================================
    -- <>.find_all(name, attrs,recursive, string, **kwargs)
    返回一个列表类型, 存储查找结果,
    --name:对标签名称的检索字符串。
    --attrs:对标签属性值的检索字符串,可标注属性检索。
    --recursive:是否对子孙全部检索,默认True
    --string:<>…</>中字符串区域的检索字符串

    =========================================================
    url:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
    功能描述:
    -输入:大学的URL链接
    -输出:大学排名信息的屏幕输出(排名, 大学名称, 总分)
    -技术路线:requests-bs4
    -定向爬虫:仅对输入url进行爬取, 不扩展爬取
    程序的结构设计:
    -步骤1:从网络上获取大学排名网页内容
    -- getHTMLText()
    -步骤2:提取网页内容中信息到合适的数据结构
    -- fillUnivList()
    -步骤3:利用数据结构战术输出结果
    --:printUnivList()

    代码:
    =========================================================================
    import requests
    import bs4
    from bs4 import BeautifulSoup

    def getHTMLText(url):
    try:
    r = requests.get(url, timeout=30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text
    except:
    return ""

    def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
    if isinstance(tr, bs4.element.Tag):
    tds = tr('td')
    ulist.append([tds[0].string, tds[1].string, tds[3].string])

    def printUnivList(ulist, num):
    print("{:^10} {:^6} {:^10}".format("排名", "学校", "评分"))
    for i in range(num):
    u = ulist[i]
    print("{:^10} {:^6} {:^10}".format(u[0], u[1], u[2]))

    def main():
    uinfo = []
    url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)

    if __name__ == '__main__':
    main()
    =========================================================================
    中文对齐问题的解决:
    采用中文字符的空格填充 chr(12288)
    ========================================
    def printUnivList(ulist, num):
    tplt = "{0:^10} {1:{3}^10} {2:^10}"
    print(tplt.format("排名", "学校", "总分", chr(12288)))
    for i in range(num):
    u = ulist[i]
    print(tplt.format(u[0], u[1], u[2], chr(12288) ))
    =========================================================
    7.正则表达式:
    regular expresson regex RE
    正则表达式是用来简洁表达一组字符串的表达式
    -通过的字符串表达框架
    -简洁表达一组字符串的表达式
    -针对字符串表达“简洁”和“特征”思想的工具
    -判断某字符串的特征归属

    正则表达式在文本处理中十分常用
    -表达文本类型的特征(病毒、入侵等)
    -同时查找或替换一组字符串
    -匹配字符串的全部或部分

    正则表达式的使用
    -编译:将符合正则表达式语法的字符串转换成正则表达式特征

    正则表达式的语法:
    正则表达式语由字符和操作符构成

    RE库的介绍:
    RE库是Python的标准库, 主要用于字符串匹配。
    调用方式: import re

    正则表达式的表示类型
    -raw string类型(原生字符串类型--- 不包含转义符的字符串)
    * re库采用raw string类型表示正则表达式, 表示为“r.text”
    * string 类型, 更繁琐
    RE库主要的功能函数:
    -re.search():在一个字符串中搜索匹配正则表达式的第一个位置, 返回match对象
    *re.search(pattern, string, flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -string:待匹配的字符串
    -flags:正则表达式使用时的控制标记
    -re.match():从一个字符串的开始位置起匹配正则表达式, 返回match对象
    *re.match(pattern, string, flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -string:待匹配的字符串
    -flags:正则表达式使用时的控制标记
    -re.findall():搜索字符串, 以列表类型返回全部能匹配的子串
    *re.findall(pattern, string, flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -string:待匹配的字符串
    -flags:正则表达式使用时的控制标记
    -re.split():将一个字符串按照正则表达式匹配结果进行分割, 返回列表类型
    *re.split(pattern, string,maxslplit=0, flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -string:待匹配的字符串
    -maxslplit:最大分割数, 剩余部分作为最后一个元素输出
    -flags:正则表达式使用时的控制标记
    -re.finditer():搜索字符串, 返回一个匹配结果的迭代类型,每个迭代元素是match对象
    *re.finditer(pattern, string, flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -string:待匹配的字符串
    -flags:正则表达式使用时的控制标记
    -re.sub():在一个字符串中替换所有匹配正则表达式的字串, 返回替换后的字符串
    *re.sub(pattern, replstring, coount=0,flags=0)
    -pattern: 正则表达式的字符串或原生字符串表示
    -repl:替换匹配字符串的字符串
    -string:待匹配的字符串
    -count:匹配的最大替换次数
    -flags:正则表达式使用时的控制标记
    =================================================================
    ======淘宝商品比价定向爬虫 示例编写
    =================================================================
    功能描述:
    *目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格。
    *理解:淘宝的搜索接口。
    -翻页的处理:
    *定向爬虫可行性
    robots.txt
    程序的结构设计
    步骤1:提交商品搜索的请求,循环获取页面。
    步骤2:对于每个页面, 提取商品名称和价格信息
    步骤3:将信息输出到屏幕上

  • 相关阅读:
    qsort
    strcmp
    LotteryDrawing
    retire or not retire ? is a question.
    alloc && afree
    strlen
    c point
    c point ccccc
    MySQL MGR源码分析2
    MySQL MGR实现分析
  • 原文地址:https://www.cnblogs.com/nori/p/12243508.html
Copyright © 2011-2022 走看看