爬虫基础一

Requests库

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

Response对象的属性

r=requests.get()
属性说明
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码格式(备选编码格式)
r.content HTTP响应内容的二进制形式

理解Requests库的异常

异常说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败,拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常

Request类

属性或方法说明
.url Request对应的请求url地址
.method 对应的请求方法,'GET','POST'等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy() 复制该请求

HTTP协议

URL格式 http://host[:port][path]

  • host:合法的Internet主机域名或IP地址
  • port:端口号,缺省端口为80
  • path:请求资源的路径

爬取实例

import requests
url = 'https://www.amazon.cn/gp/product/b01MBL5Z3Y'
try :
    kv = {'user-agent':'Mozilla/5.0'}
    r = requests.get(url,headers=kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print('获取失败')
View Code

图片爬取

import requests
path = 'D:/图片/abc.jpg'
kv = {'user-agent':'Mozilla/5.0'}
url = 'https://inews.gtimg.com/newsapp_bt/0/10881420534/1000'
r = requests.get(url,headers=kv)
with open(path,'wb') as f:
    f.write(r.content)
    f.close()
View Code

Beautiful Soup库

Beautiful Soup库解析器

解析器使用方法条件
bs4的HTML解析器 BeautifulSoup(mk,'html.parser') 安装bs4库
Ixml的HTML解析器 BeautifulSoup(mk,'Ixml') pip install Ixml
Ixml的XML解析器 BeautifulSoup(mk,'xml') pip install Ixml
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib

Beautiful Soup类的基本元素

基本元素说明
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<p>...</p>的名字是'p',格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>...</>中字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

标签树的平行遍历

属性说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后序所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前序所有平行节点标签

三种信息标记形式的比较

  • XML:最早的通用信息标记语言,可扩展性好,但繁琐
  • JSON:信息有类型,适合程序处理(js),较XML简洁
  • YAML:信息无类型,文本信息比较比例最高,可读性好

中国大学排名实例

import requests
from bs4 import BeautifulSoup
import bs4


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[2].string])


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


if __name__ == '__main__':
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,20)
View Code

Re库

正则表达式的常用操作符

操作符说明实例
. 表示任何单个字符  
[] 字符集,对单个字符给出取值范围 [abc]表示a,b,c,[a-z]表示a到z单个字符
[^] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc*表示ab,abc,abcc,abccc等
+ 前一个字符1次或无限次扩展 abc+表示abc,abcc,abccc等
? 前一个字符0次或1次扩展 abc?表示ab,abc
| 左右表达式任意一个 abc|def表示abc,def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc,abbc
^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
() 分组标记,内部只能使用|操作符 (abc)表示abc,(abc|def)表示abc,def
d 数字,等价于[0-9]  
w 单词字符,等价于[A-Za-z0-9_]  

正则表达式实例

^[A-Za-z]+$ 由26个字母组成的字符串
^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串
^-?d+$ 整数形式的字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]d{5} 中国境内邮政编码,6位
[u4e00-u9fa5] 匹配中文字符

Re库主要功能函数

函数说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub 在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串

最小匹配操作符

操作符说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配
原文地址:https://www.cnblogs.com/caozhenghua/p/11997150.html