Scrapy 基础

≡放荡痞女 提交于 2020-01-30 19:42:15
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.headersrequests库的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的GETrequests.head():获取HTML网页头信息的方法, 对应于HTTP的HEADrequests.post():向html网页提交post请求的方法, 对应HTTP的POSTrequests.put():向html网页提交PUT请求的方法, 对应HTTP的PUTrequests.patch():向html网页提交局部修改请求, 对应HTTP的PATCHrequests.delete():向html页面提交删除请求,对应于HTTP的DELETErequests.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 requestsr=requests.get(url)with open(path, 'wb') as f:    f.write(r.content)=================================IP地址的查询:------              -----------------------import requestsurl = '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 beautifulsoup4BeautifulSoup测试:-----------------------import requestsr=requests.get('http://python123.io/ws/demo.html')print(r.text)demo=r.textfrom bs import BeautifulSoupsoup = 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 requestsr=requests.get('http://python123.io/ws/demo.html')print(r.text)demo=r.textfrom bs4 import BeautifulSoupsoup = 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 requestsimport bs4from bs4 import BeautifulSoupdef 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}\t{:^6}\t{:^10}".format("排名", "学校", "评分"))    for i in range(num):        u = ulist[i]        print("{:^10}\t{:^6}\t{:^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}\t{1:{3}^10}\t{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:将信息输出到屏幕上
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!