爬虫学习–对requests的基本使用和网页解析
爬虫操作
-
requests库
- 需要下载 pip install requests
- 导入模块 import requests
-
requests 提交请求的方式有两种
get和post
使用哪种方式请求需要查看network抓包的信息
下图中,
Request URL是发送请求的地址
Request Method是请求该链接的方式,此处用get方法请求百度网页
Response Headers是发送请求后将会回应的信息
响应头中,查看Content-Type,文中是text/html 则回应的是文本类型的html代码
点击Response即可查看将要返回的数据内容
get方法
import requests
get 参数有
url 请求的地址
params 提交的参数,会出现在地址栏后面
r = requests.get(url,params=None)
post方法
import requests
post 参数有
url 请求地址
data 请求提交的数据
json 提交json格式的数据
r = requests.post(url,data=None,json=None)
使用情况
有时候为了网页跟服务器更好的交互,会选择发送ajax请求,用post方式提交请求
响应头的content-type是json,则提交request请求后,将会以json格式响应,
响应内容在Response里
反反爬机制
- UA设置
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
r = requests.get(url,headers=headers)
BeautifulSoup 解析
- pip install bs4
- pip install lxml
from bs4 import BeautifulSoup
需要创建BeautifulSoup对象,参数有
str html文本内容
'lxml' 解析方式
r = requests.get(url)
soup = BeautifulSoup(r.text,'lxml')
使用方法
soup.tagName 都是查找第一个tagName的内容
soup.find('tagName')
属性定位
soup.find('tagName',class_='name') 查找class属性是name的tagName标签
soup.find_all('tagName') 查找所有tagName的内容,返回的是列表类型
soup.select() 标签选择器,类似于jquery的选择器
soup.select('.className a') 查找class属性是className下的所有a标签,返回的是列表类型
获得非属性字符串
soup.tagName.text/get_text()/string
.text和.get_text():找到该标签下所有的字符串
string: 找到该标签的直属字符串
获得标签属性值
soup.tagName['class'] 获得该标签的class属性的值
xpath
安装环境
下载 pip install lxml
导入 from lxml import etree
基本使用
- 建立etree对象
- 导入本地html
指定页面的编码格式 parser = etree.HTMLParser(encoding=“utf-8”)
tree = etree.parse(‘广州.html’,parser=parser) - 获得网页文本
tree = etree.HTML(‘html文本’,parser=parser)
- 导入本地html
如果本地html不符合编码格式会报错,因此需要添加parser
-tree.xpath(‘xpath表达式’)
- / 最左边的斜杠表示从根节点开始定义,其他的表示一个层级
- // 表示多个层级,可以任意地方地位
- 属性定位 /tagName[@class=“classname”]
- 索引定位 /tagName[i] i是从1 开始索引
- 取文本
/text() 获得标签的直系文本内容
/div/text() 获得div的直系文本内容
//text() 获得标签所有的文本内容 - 取属性
/@attrName
ex: /img/@src 获得照片的src属性的值 - 局部定位
li = tree.xpath(’//div/li’) 找到div里的li元素
li.xpath(’./a/text()’) 从上述找到的li元素开始找a的文本内容
解决乱码问题
res = requests.get(url,headers=headers)
res.encoding = res.apparent_encoding
或者
detail_name = detail_name.encode('iso-8859-1').decode('gbk')