beautyfulsoup模块

爬虫最常见的是处理反扒措施:常见的反扒措施

user-agent :用户请求浏览器信息(需要要携带) 

refer:请求到来的路径 有时候需要携带

token:服务器发送的验证字符串,需要分析

cookies:可以使用session处理

requests属性

最常用的两个函数:get() post()

参数有:

params={"":""},可以指定请求路径中的参数,自动解析

headers={}:请求头信息,需要关键字参数:如:"user-agent"="","refer":"",等等

resp = requests.get(url=url,params=params,headers=headers)

resp.text:响应返回的文本信息

resp.content:响应返回的二进制数据(可以用来传输图片video等)

resp.status-code:相应的状态码(判定是否请求成功)

resp.url:请求的路径

resp.cookies:获取返回的cookies信息(是一个对象)

resp.cookies.get_dict():获取返回cookies信息的字典格式可以通过get获取

resp.json():将返回的json数据进行反序列化

resp.requests:请求的方法

resp.apparent_encoding:从文档中获取编码的方式

resp.encoding:默认的编码方式可指定

resp.headers:查看响应头(好像是可以获取浏览器中的信息)

resp.history:重定向历史  即前一次请求的地址

resp.url:当前的请求地址

可以在get方法中指定参数streamTrue

流流的方式获取数据,没有经过HTPP协议解析的数据

resp.raw.read(100)读取100字节(没什么用)

当文档的编码方式与response解码方式不同时,就需要手动指定

resp.encoding  = resp.apparent_encoding

对于返回值为json格式的处理

jsonresp = resp.get("http://v.juhe.cn/toutiao/inedx")

print(jsonresp.text)

print(jsonresp.json())

对于post请求,data和json都能传递参数

其中data方式拼接为 name=jerry&pwd=123

json直接序列化为字符串

超时时间 第一个参数为连接超时时间,第二个表示响应超时时间

requets.post(url,timeout=()10,10))

allow_redirects是否允许重定向

代理池:对于爬虫而言是一个相当重要的参数

Ps=,["""""""""""",,""""",,,",",""]

import random

使用代理服务器请求

resp = request.post(url,proxies={"HTTP":randoim.choice(Ps)})

verify证书验证,目前已基本不再使用,都换成了HTTPS请求

Import requests

response=  requests.get(url,cert=("qiwuedghqd./fwe"),verify=True)

上传文件:

f = open('路径名','rb)

接受一个字典,key是服务器用于提取文件的字段名,f是要上传的文件对象

resp = requests.post(url,files={"img":f})

beautifulSoup模块

在之前的爬虫程序中,使用了大量正则获取数据,效率非常低,beautifulSoup是一个第三方模块,专门用于解析XML文档,目前最稳定的是bs4版本

from bs4 import BeaustifulSoup

html_doc = """fvuiwbfuiwebfiwbfwib"""

第一个参数为要解析的文档数据,可以是字符串,也可以是一个文件对象

第二个参数表示要使用的解析器,每个解析器都有不同的特点,推荐是lxml,速度快

soup = BeautifulSoup(html_doc,"lxml")

一个标分为三部分:标签名字,标签属性,标签内容

tag = soup.body

tag.name tag.text tag.attrs

使用.语法来查找标签,注意查找范围是全文只能找第一个与名字匹配的标签

可以嵌套

获取子节点:

soup.p.children返回的是一个迭代器可以使用list转型

soup.head.contents:返回一个列表

获取父标签soup.p.parent

soup.p.parents获取所有的父辈标签

soup.p.descendants#获取所有子孙标签,不同之处在于,会把所有子孙标签全部拆出来,包括文本内容

获取兄弟标签,文本也被当做一个节点

下一个兄弟:soup.a.next_sibling.next_sibling

过滤器

fin_all查找所有匹配的标签

按照名字匹配,可以传一个名字,或一个列表

find_all("a"),find_all(["a","b"])

查找id为link1的a标签

soup.find_all("a",attrs={"id":"link1"})  soup.find_all(name="a",id="link1")

查找标签为a类名为sister的

soup.find_all("a",attrs={"class":"sister"})

注意如果按照条件为class来查找,需要使用class_,因为class是关键字

多个类名加空格即可

soup.gind_all(name="a",class_="sister.brother")

如果属性中带有特殊符号,可以把条件装在attrs中

可以指定按照文本内容查找:

soup.find_all(name="a",text="sb")

过滤器:

标签名称中带有b字母的标签

soup.find_all(name="b")

正则匹配

c = re.compile("b")

soup.find_all(name=c)

数组

soup.find_all(name=["body","a"])

True表示所有标签,soup.find_all(True) 

所有具备id属性的标签 soup.find_all(id=True)

方法匹配(可以写个函数匹配)

def Filter(tag):

  return tag.name == "a" and tag.text != "sb" and tag.has_attr("id")

soup.find_all(name="a",limit=1)显示结果为一条

find方法等同于find_all

选择器

soup.select("a")

soup.select(".sister")

soup.select("#link1")

soup.select("p>ssss")

原文地址:https://www.cnblogs.com/suncunxu/p/10697916.html