Python 爬取
requests
requests用来爬取网站上的信息。有七个主要方法
- r = requests.get(url, params, ** kwargs): url是你想爬取网站的url。通过get构造了一个向服务器请求资源的Request对象。返回一个包含服务器资源的Response对象。
- head(): 获取网页头部信息
- post(url, data, json, kwargs): 在后面添加数据。默认如果是列表等会存储到form字段下,如果是字符串会存在data字段下
- put(): 覆盖网页某一字段数据。例如上传字符串会把data字段覆盖
- patch(): 删改某一位置信息(和put的区别是put必须全部删除,patch只需要修改需要改的部分)
- delete(): 删除url处的资源
- request(method, url, ** kwargs): method有七种,分别是’GET’,’OPTIONS’等,注意其中delete是小写。
kwargs参数(get,put, patch要比request少params,head,delete相同,post11个):
- params: 输入参数
例子
- data: 提交资源,一般用用字典的形式
- json: 可以作为request的内容
- headers: http头字段
- cookies:
- auth: http认证功能
- files: 传输文件时使用
- timeout: 设定的超时时间
- proxies: 设定访问代理服务器
- allow_redirects: 默认是True。重定向开关
- stream: 是否对获取内容立即下载。默认立即下载
- verify: 认证SSL证书字段
- cert: 保存本地ssl路径字段
Response对象属性:
- status_code: 200表示成功,404表示失败(不是200就是失败)
- text: 爬取内容的字符串形式。
- encoding: 猜测的编码形式。这是从服务器的charset字段获得的。如果服务器中没有charset字段,那么会返回ISO-8859-1
- apparent_encoding: 备选编码形式.它是根据内容分析的(可能这个更加准确)
- content: 爬取内容的二进制形式
- request: response对应的request对象
爬取模板
requests异常种类:
模板:
有些网页会拒绝爬虫的爬取,这个时候我们可以通过更改头部信息让我们看上去是浏览器爬取。模板为:
想要运用爬虫使用搜索引擎。首先要知道搜索引擎的接口,百度的接口是http://www.baidu.com/s?wd=keyword
.360的接口是 http://www.so.com/s?q=keyword
。其中keyword就是我们要搜索的内容。所以我们只需要在搜索时让url加上wd或q字段即可。
模板:
获取图片要用二进制读取的方式,模板为
ip138是一个用来查询ip内容的网站。它的接口是"http://m.ip138.com/ip.asp?ip=..."
于是我们可以通过这个接口去访问ip地址的内容。
模板:
beautifulsoup4
beautifulsoup4可以用来解析html和xml。
导入: import bs4或from bs4 import Beautifulsoup
基本元素:
- Tag: 标签,如
<></>
- Name: 标签的名字,如
<p></p>
中的p - Attribute: 标签属性,如
<img src="..." alt="...">
中的src和alt。它是一个字典类型,可以用<tag>.attrs
访问 - NavigableString: 两个标签之间的字符串。用
<tag>.string
访问 - Comment: 标签中间字符串的注释
一些函数:
- prettify(): 在标签之间添加换行符,让html文本易读。
- find_all(name, attrs, recursive, string, ** kwargs); 查找所有标签,返回列表,它有一种简写形式,标签(…),因为它十分常用。name是标签名字。attrs是对某一属性值的检索(如果某个标签有这个属性返回的还是这个标签)。recursive是是否对所有子孙进行搜索,默认是True。string是检索两个标签之间的字符串。
- find(),find_parents(),find_parent(),find_next_siblings(),find_next_sibling,find_preivous_siblings,find_previous_sibling(): 这些方法的参数和使用方法相同。其中find()只返回第一个结果并且是字符串类型。
解析器:
例:with open("F:/html/test.html", encoding='utf-8') as f:
soup = BeautifulSoup(f, "html.parser")
标签树的遍历
任何html文档都可以看成是一个标签树,树的根节点就是,因此我们可以从根节点出发得到整个标签树。
可以通过soup.html获得html标签。然后标签有如下属性:
- contents。子节点列表。\n也在列表中
- children。子节点迭代类型,用于循环遍历儿子节点
- descendants。包括所有的子孙节点,用于循环遍历
- parent。 父亲标签
- parents。 所有前辈
- next_sibling: 返回html文本顺序的下一个平行标签(也就是父亲节点相同)。navigable_string也在列表中
- previous_sibling: 返回html文本顺序的上一个平行标签
- next_siblings
- previous_siblings
正则表达式
例如: 0-99表示 [1-9]?/d
python使用rowstring类型来表达正则表达式,即r’…’。这种String不会出现转义现象
函数:
- re.compile(pattern, flags=0): 把正则表达式编译成对象,便于多次使用。形成对象之后就可以使用下面的六个方法,都是相对的少了pattern参数
- search(pattern, string, flags=0): pattern是正则表达式字符串后者原生字符串。因为原生字符串有些字符要转义,比较麻烦。String是要搜寻的文本,flags是控制标记
- match匹配的字符串必须是从字符串开头开始。例如r3,如果我们用match搜寻数字,会返回空,因为数字不是从开头开始的。
- split(pattern, string, maxsplit=0, flags=0): maxsplit是最大分割数,多余的部分将作为最后一个元素输出。split函数会去掉匹配上的部分,然后剩下的部分用一个列表输出,maxsplit就是最多去掉多少个匹配的
- sub(pattern, repl, string, count=0, flags=0): repl是替换字符串,count是替换次数
这是flags常用标记
match对象的属性:
- string: 待匹配的文本
- re: 匹配时用的正则表达式
- pos: 正则表达式搜索文本的开始位置
- endpos: 结束位置
match的方法:
- group(0): 获得匹配后的字符串
- start(): 匹配字符串在原来字符串的开始位置
- end(): 结尾位置
- span(): 返回(start(), end())
如果没有匹配上,会返回一个空指针
python默认是贪婪匹配,即返回多个匹配结果,例如search返回的就是最长的那个
如果我们想匹配最短字符串,就需要在匹配多个字符的后面加上一个问号。例如:
*?
、+?
、??
、{m, n}?