Python爬取静态网页的方法:
#导入包
import requests
#构造url地址
url = 'https://ssr1.scrape.center/page/1'
#构造请求头的信息(防止它发现我是爬虫)
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'
}
#发送请求
response = requests.get(url=url,headers=headers)
#print(response.status_code) #状态码
#print(response.text) #文本内容
#如果有的时候看.test是乱码,我们可以把内容转化为二进制然后再将二进制转码为utf-8的。
print(response.content) #二进制内容
print(response.content.decode('utf-8')) #二进制内容
如果有时候运行.test是乱码,我们可以把内容转化为二进制(.content)然后再将二进制转码为utf-8(.content.decode('utf-8'))。
数据解析:使用Xpath表达式解析网页:
(注意:此处有误,..:表示的是选取当前节点的父节点)
//:可以认为是任意门,可以任意路劲进行访问。
.//:一般用于循环中在当前url下不断进行访问。
.:在选取当前节点进行操作。
/:从该层级进行选取。
@:选取属性。
网页提取信息:
# 数据解析
# 构造一个结构化的对象,方便解析使用
tree = etree.HTML(response) # 结构化你所选取的网页,才能拿Xpath进行解析。
div_list = tree.xpath('//div[@class="el-col el-col-18 el-col-offset-3"]/div') # 固定一个查询的父节点,对他的子节点进行采数据。
for div in div_list:
name = div.xpath('.//h2[@class="m-b-sm"]/text()')[0] # 如果不加.那么会在这个父节点里把需要的h2子节点每次循环都重新查询一次。
address = div.xpath('.//div[@class="m-v-sm info"][1]/span/text()')[0] # xpath中[]是谓语的意思,并且[1]是定位到第一个标签的意思。但是注意后面括号外的[0]则又不一样这个则是从取第一个
long = div.xpath('.//div[@class="m-v-sm info"][1]/span/text()')[2]
time = div.xpath('.//div[@class="m-v-sm info"][2]/span/text()')
# print(name)
# print(address)
# print(long)
# print(time)
print(name,address,long,time)
假设如果time中有一个电影的time是空的并且在m-v-sm info下的非第一个span目录下(比如是第二个span)那么我们在提取电影time的时候
time = div.xpath('.//div[@class="m-v-sm info"][2]/span/text()')[1]
这段代码则会报错,因为这一段代码中的time有空[ ],所以会出现list index out of range列表索引超出范围的错误。
那么我们可以采取一下方法避免这种错误:
href是一段url地址,是后半段部分,前半段就是这个网页的地址。
若是要给数据前面加上标题的话,我们需要用csv.DictWriter()而不能用csv.Writer(),只有csv.DictWriter()有filename这个属性。