爬虫的一些知识

读者可以不用看这段
(用python来编写脚本简化日常的运维工作是python的一个重要用途,在linux中,可以用ps,top,free这样的命令查看,在python中,获取系统信息的一个好办法就是psutil这个第三方模块,它是python的系统监控及进程的管理工具,是一个系统很强大的跨平台的系统管理库,目前psutil支持的系统有linux,window os X等)

一、requests请求库

1、介绍

requests是一个优雅而简单的python HTTP请求库,requests的作用是发送请求获取响应数据

2、安装

在终端(命令行工具)运行如下命令即可

pip install requests
pip list可以查看安装了的库

注意:

1、如果你要安装python虚拟环境中,先进入虚拟环境再执行上述命令
2、如果系统中既安装了python2,又安装了python3,需要安装python3环境中:pip3 install requests

3、requests基本使用

1、请求方法
在这里插入图片描述

1、导入模块
2、发送get请求,获取响应
3、从响应中获取数据

1、导入模块
import requests
2、发送请求,获取响应
response=requests.get("http://www.baidu.com")
3、从响应中获取数据
print(response.text)

response常见属性:

response.test:响应的字符串数据
response.encoding:打印使用的字符编码
response.content:打印响应的二进制数据
设置编码为utf-8:response.encoding="utf-8"

4、requests发送带header的请求和带参数的请求

1、header
在这里插入图片描述
2、params

你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。
在这里插入图片描述
效果如下图所示
在这里插入图片描述

代码练习:
在这里插入图片描述
结果为:
在这里插入图片描述
在网上解码以后就是https://www.baidu.com/传智播客

5、爬虫实战

import requests
class TIebaSpider:
    def __init__(self,tieba_name):
        self.tieba_name=tieba_name
        self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
        self.url_temp="https://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn={}"
    #构造url列表
    def get_url_list(self):
        url_list=[]
        for i in range(3):
            url_list.append(self.url_temp.format(i*50))
        return url_list
    #发送请求,获取响应
    def parse_url(self,url):
        print(url)
        response=requests.get(url,headers=self.headers)
        return response.content.decode()
    def save_html(self,html_str,page_num):
        file_path="{}-第{}页".format(self.tieba_name,page_num)
        with open(file_path,"w",encoding="utf-8") as f:
            f.write(html_str)
    def run(self):
        #1、构造url列表
        url_list=self.get_url_list()
        #2、遍历,发送请求,获取响应
        for url in url_list:
            html_str=self.parse_url(url)
        #3、保存
            page_num=url_list.index(url)+1
            self.save_html(html_str,page_num)
if __name__=="__main__":
    tieba_spider=TIebaSpider("李毅")
    tieba_spider.run()

6、requests深入

6.1、发送post请求

在这里插入图片描述
用法:

response=requests.post("http://www.baidu.com/",data=data,headers=headers)
data的形式:字典

请求百度翻译的应用
在这里插入图片描述
结果为:
在这里插入图片描述
想要实现任意输入,代码如下:
得在上述的代码里加上以下代码
在这里插入图片描述
效果为:
在这里插入图片描述

6.2 使用代理

在这里插入图片描述

在这里插入图片描述
代码实现:
在这里插入图片描述

6、3 requests模拟登录的三种方式

二、BeautifulSoup库

1、BeautifulSoup库的作用

是一个可以从html或xml文件中提取数据的python库

2、安装BeautifulSoup库

1、先安装beautiful Soup4 
pip install bs4
2、安装lxml解析库
pip install lxml

3、BeautifulSoup对象介绍与创建

BeautifulSoup对象

beautifulSoup对象:代表要解析整个文档树,它支持遍历文档和搜索文档树中描述的大部分的方法

创建BeautifulSoup对象

1、导入模块
from bs4 import BeautifulSoup
2、创建BeautifulSoup对象
soup=BeautifulSoup("<html>data</html>","lxml")
print(soup)

结果为:
在这里插入图片描述

4、BeautifulSoup对象的find方法

find的作用

搜索文档树

find的用法

find(self,name=None,attrs={},recursive=True,text=None,**kwargs)
参数:
name:标签名
attrs:属性字典
recursive:是否递归循环查找
text:根据文本内容查找
返回:查找到的第一个元素对象
若想要返回所有元素对象,则使用find_all

案例1:根据标签名查找
获取下面文档中的title标签和a标签
在这里插入图片描述
解题步骤:

1、导入模块
2、准备文档字符串
3、创建BeautifulSoup对象
4、查找文档中的title标签
5、查找文档中的a标签

#1、导入模块
from bs4 import BeautifulSoup
#2准备文档字符串
html='''写入上面图片的代码'''
#3、创建BeautifulSoup对象
soup = BeautifulSoup(html,"lxml")
#4、查找title标签
title=soup.find("title")
print(title)
#5、查找a标签
a=soup.find("a")
print(a)
#6、查找所有的a标签
a_s=soup.find_all("a")
print(a_s)

结果为:
在这里插入图片描述
案例2:根据属性进行查找
查找id为link1的标签

...
#方式1:通过命名参数进行指定
# id=soup.find(id="link1")
# print(id)
#方式2:使用attrs来指定属性字典进行查找
a=soup.find(attrs={"id":"link1"})
print(a)

案例3:根据文本查找
获取下面文档为elise的标签文本

#6、查找文本为elise的标签文本
text=soup.find(text="elise")
print(text)

5、Tag对象

tag可以获取标签内容

...
a=soup.find(attrs={"id":"link1"})
print(a)
#7、tag对象
print(type(a))
print("标签名:",a.name)
print("标签所有属性:",a.attrs)
print("标签文本内容:",a.text)

结果为:
在这里插入图片描述
小结:
在这里插入图片描述

三、应用-从疫情首页获取数据

#1、导入相关模块
import requests
from bs4 import BeautifulSoup
#2、发送请求,获取疫情首页内容
response=requests.get("http://ncov.dxy.cn/ncovh5/view/pneumonia")
#3、从响应中获取数据
home_page=response.content.decode()
# print(home_page)
#4、使用BeautifulSoup,提取疫情数据,构建BeautifulSoup对象
soup=BeautifulSoup(home_page,"html.parser")
#根据id属性查找,包含全国疫情信息的标签
script=soup.find(id="getAreaStat")
#获取标签中文本内容
text=script.text
print(text)

四、正则表达式

概念

正则表达式是一种字符串匹配模式

作用

其中python爬虫中用的最多的就是:提取某个字符串中匹配的子串

正则表达式常见语法

.匹配任意一个字符
\转义字符,使后一个改变原来的意思
[…]表示取[]范围中的某一个
\d匹配数字:[0-9]
\D匹配非数字
\s空白字符
\S非空白字符
\w单词字符[A-Za-z0-9_]
\W非单词字符
*匹配前一个字符0或无限次
+匹配前一个字符1次以上
?匹配前一个字符0次或1次
{m}匹配前一个字符m次

1、re.findall()方法

语法:

re.findall(pattern,string,flags=0)
参数:
pattern:正则表达式
string:从这个字符串中查找
flags:匹配模式

作用:

扫描整个string字符串,返回所有与pattern匹配的列表

返回值:

返回string中与pattern匹配的结果列表

分组的使用

#2、findall方法中分组的使用
import re
#2、findall方法中分组的使用
rs=re.findall("a.+bc","a\nbc",re.DOTALL)
print(rs)
rp=re.findall("a(.+)bc","a\nbc",re.DOTALL)
print(rp)
结果为:
['a\nbc']
['\n']

总结:

如果正则表达式中没有(),则返回与整个正则匹配的列表;
如果正则表达式中有(),则返回()中匹配的内容列表,小括号两边东西都是负责确定提取数据所在位置

2、r原串的使用

主要用来解决转义符的问题

#1、在不使用r原串的时候,遇到转义符怎么做
rs=re.findall("a\nbc","a\nbc")
print(rs)
#2、r原串在正则中就可以消除转义符带来的影响
rs=re.findall(r"a\nbc","a\nbc")
print(rs)
结果为:
['a\nbc']
['a\nbc']

结论:

正则中使用r原始字符串,能够忽略转义符号带来的影响
待匹配的字符串中有多少个,r原串正则中就添加多少个\即可

五、json模块

1、json简介

json模块是python自带的模块,用于json与oython数据之间的相互转换

2、json与python数据类型的对应关系

jsonpython
objectdict
arraylist
stringstr
number(int)int,long
number(real)float
trueTrue
falseFalse
nullNone

3、json转换为python

图解如下:
在这里插入图片描述

import json
#1、将json字符串转换为python数据
#1.1 准备json字符串
json_str='''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":68851},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
#转换为python数据
rs=json.loads(json_str)
print(rs)
#打印rs的类型
print(type(rs))
#打印rs里第一个元素的类型
print(type(rs[0]))
#2、把json格式文件,转换为python类型的数据
#2、1构建指向该文件的文件对象
with open("test.json") as fp:
    #2、2加载该文件对象,转换为python类型的数据
    python_list=json.load(fp)
    print(python_list)
    print(type(python_list))
    print(type(python_list[0]))

结果为:
[{'provinceName': '美国', 'currentConfirmedCount': 1179041, 'confirmedCount': 68851}, {'provinceName': '英国', 'currentConfirmedCount': 222227, 'confirmedCount': 259559}]
<class 'list'>
<class 'dict'>

4、python转换为json

在这里插入图片描述

import json
#1、把python转换为json字符串
#1.1 准备Python数据
json_str='''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":68851},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
rs=json.loads(json_str)
#1.2 把python转换为json字符串
json_str=json.dumps(rs,ensure_ascii=False)
print(json_str)
#2、把python以json格式存储到文件
#2、1构建要写入的文件对象
with open("test1.json","w") as fp:
    json.dump(rs,fp,ensure_ascii=False)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值