爬虫最常见的是处理反扒措施:常见的反扒措施
user-agent :用户请求浏览器信息(需要要携带)
refer:请求到来的路径 有时候需要携带
token:服务器发送的验证字符串,需要分析
cookies:可以使用session处理
最常用的两个函数: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.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