一.爬取网页并获得网页源代码
1.导入requests包
(import requests)
requests是用于发起请求,请求的发起是使用http库向目标站点发起请求,即发送一个request。request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可以通过HTML表单或在网页地址后面提供参数的方法提交数据。request对象的作用是与客户端交互,收集客户端的form、cookies、超链接,或者收集服务器端的环境变量。
2.定制请求头
(header={“User-Agent”:“xxx”})
请求头中User-Agent:中如果没有user-agent客户端配置,服务器可能讲你当做一个非法用户,一般做爬虫都会加上请求头。它告诉服务器,我的设备/浏览器是什么,我从哪个页面而来。
(在浏览器中的开发者工具/F12里,如果没有内容可以Ctrl+R进行刷新)
3.添加网页网址
(url='https://xxx.com/')
url='https://weibo.com/'
url地址全称是统一资源定位符,一个网页文档、一张图片、一个视频都可以用url唯一来确定。
4.设置请求方式和请求头
请求响应,获取内容。requests模块发送请求时,有两种携带参数的方法,params和data。
reponse=requests.get(url,headers=header)
(params在get请求中使用,data在post请求中使用。)
5.获取网址文本方式的响应内容,并以HTML的方式写入文件
reponse.encoding=reponse.apparent_encoding
#获取网址文本方式的相应内容
with open('weibo.html','w',encoding=str(reponse.encoding)) as f:
f.write(reponse.text)
6.查看HTML文件(源代码)
二.获取源代码中的元素内容
1.下载LXML库
(pip install lxml)
LXML库是一款高性能的Python XML库,主要用来解析以及生成xml和html文件(解析、序列化、转换等)。
2.导入LXML库中的etree包
(import etree from lxml)
在LXML中,lxml.etree模块是最常用的HTML、XML文档解析模块。通过requests.get方法获得html源代码后,可以通过etree进行解析,进而从源代码中提取关键信息。
(etree同Beautiful Soup一样均可以解析xml和html,两者不同之处在于:etree主要通过xpath进行定位,而Beautiful Soup主要通过css进行定位。)
3.使用etree解析HTML网页内容
selector=etree.HTML(html)
4.查询标签里所需要的内容
获取文本的元素内容:
(1)查询"li"标签下的所有元素
list_all= selector.xpath('//div/ul/li')
print(list_all)
也可以简写成以下代码
list_short=selector.xpath('//li')
print(list_short)
(2)查询"li"标签下的第2个元素内容
list_2=selector.xpath('//div/ul/li[2]/a/text()')
print(list_2)
li[2]代表的是li标签下的第二个元素,text()代表的是输出此元素的文本内容。
简写成
list_2_short=selector.xpath('//li[2]/text()')
print(list_2_short)
加上"_short"可以只输入元素所属的最后一个标签,其前面的标签可以省略
获取标签的文本内容:
(1)查找出已知HTML中[li]中第一个[li]标签下的a元素文本信息
list_1=selector.xpath('//li[1]/a/text()')
print(list_1)
也可以用以下代码获取到
list_1_element=selector.xpath('//li[1]/a/text()')[0]
print(list_1_element)
element类是通过获取Document上的元素,进而提取数据、遍历节点以及操作元素。这里的element是将第二个[li]标签下a元素的文本信息全部遍历输出。
[0]是指遍历后选择输出第一个获取到的文本信息
(2)通过class属性定位查找出已知html中[li]中的第三个[li]标签属性和a元素文本信息
list_2=selector.xpath('//li[@class="line-message"]')
print(list_2)
list_2_element=selector.xpath('//li[@class="line-message"]/a/text()')[1]
print(list_2_element)
"@"代表直接定位到[li]标签中class属性里带有line-message的位置
(3)通过herf属性定位查找出已知HTML中[li]中第4个标签属性及a元素的文本信息
list_3=selector.xpath('//*/li[4]/a[@href="link4.html"]')
print(list_3)
list_3_element=selector.xpath('//*/li[4]/a[@href="link4.html"]/text()')[0]
print(list_3_element)
"*"可以代写[li]标签以上级的所有标签