爬虫(requests库,logging库)
requests 的使用
Get请求
- params 参数进行传递各种信息
import requestsdata = {'name':'germey','age':'25'}r = request.get('url',params=data)print(r.text)
r = request.get('url',params=data)print(r.json())# 如果数据返回的不是JSON格式,就会出现解析错误,抛出json.decoder.JSONDecodeErrot异常
-
r.text 和 r.content 的区别
-
r.text 中打印时会转换成 str 类型
-
r.content 的前面带有一个b, 代表这是 bytse 类型的数据
-
-
配置请求头
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0','Host':'www.httpbin.org'}r = request.get('url',headers=headers)
POST请求
import requestsdata = {'name':'germey','age':'25'}r = request.post('url',params=data)print(r.text)
响应
-
状态码
-
响应头
-
Cookie
import requestsr = request.get('url')print(r.status_code)print(r.headers)print(r.cookies)print(r.url)print(r.history)
高级用法
- 文件上传
import requestsfile = {'file':open('favicon.ico','rb')}r = requests.post('url',file=file)print(t.text)
- 设置Cookie
# 获取Cookieimport requsetsr = requests.get('https://www.baidu.com')print(r.cookies)for key,value in r.cookies.items():print(key + '=' + value)# 我们从网站上复制请求头import requestsheaders = {'Cookie':'...','User-Agent':'...'}r = requsets.get('https://github.com/',headers=headers)print(r.text)# 创建一个RequestCookieJar 对象cookies = '..'jar = requsets.cookies.RequestsCookieJar()for cookie in cookies.split(';'):key,value = cookie.split('=',1)jar.set(key,value)r = requests.get('https://github.com/',cookies=jar,headers=headers)
-
Session
-
它通常在模拟登录成功之后,进行下一步操作时用到
s = requests.Session()
s.get(‘url’)
-
-
请求中的一些参数
-
SSL错误
- 将请求中的verify=False,就可以解决了
-
timeout 参数
-
timeout = 1
-
timeout=(5,30)
-
-
用户认证
- auth=(‘…’,‘…’)
-
代理设置
-
proxies=proxies
-
其中proxies是一个代理池
-
-
正则表达式
常用的方法
-
match
- 从字符串的起始位置开始匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,就返回None
-
search
- 它会搜索整个HTML文本,找到符合上述正则表达式的第一个内容并返回,尽量加上re.S ----> 以免出现匹配不到的问题
-
findall
- 获取全部匹配的内容
-
sub
- 借助它来修改文本
-
compile
- 这个方法将正则字符串编译成正则表达式对象,以便在后面的匹配中复用
logging模块简介
相比print的优点有如下
-
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必现实大量的调试信息
-
print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据,logging则可以有开发者决定将信息输出到什么地方,以及怎么输出
基本使用
import logginglogging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 这句得到了一个logger实例,__name__这个参数,得到运行的模块名字logger = logging.getLogger(__name__)# 这里的等级依次递增# 默认配置中只会打印 warning 级别以上的日志# 可以通过配置修改打印级别# logging.basicConfig(level=logging.INFO)logger.info("Start print log")logger.debug("Do something")logger.warning("Something maybe fail.")logger.info("Finish")# 当我们需要对日志的输出进行一些格式上的要求,我们就可以这样写,注:配置项要写在最上面,否则可能会出现各种buglogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 将日志输出到文件中logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename='TryLog.log',filemode='a')# 获得自定义的 logger# 注:这里的参数 text_logger 是该logger的名字,# 很多人会用__name__ 来命名# root 这个是全局的logger的名字test_logger = logging.getLogger('text_logger')# 创建一个Handler 实例 -----> 指定了文件名和文件的打开方式file_handler = logging.FileHandler('text_logger.txt',mode='a')# handler 里面可以设置basicConfig 里面大多数的配置,比如下面的输出格式file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))# 这里面可以放入多个handlertest_logger.addHandler(file_handler)# 异常处理try:1/0except:text_logger.exception("Get exception")参数:作用%(levelno)s:打印日志级别的数值%(levelname)s:打印日志级别的名称%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]%(filename)s:打印当前执行程序名%(funcName)s:打印日志的当前函数%(lineno)d:打印日志的当前行号%(asctime)s:打印日志的时间%(thread)d:打印线程ID%(threadName)s:打印线程名称%(process)d:打印进程ID%(message)s:打印日志信息