前一篇文章分享了正则表达式爬取数据,在这里我们回顾下爬虫的具体流程以及不同方式爬取数据具体属于哪个环节。
详解Python爬虫的工作流程:
①Python爬虫程序使用http库向目标站点发起请求,即发送一个Request请求
②服务器响应请求,爬虫会得到一个Response;Python爬虫通过正则表达式(RE模块)或者第三方解析库(例如:Beautifulsoup、pyquery)去解析HTML数据,使用JSON模块解析JSON数据;
③Python爬虫将数据保存到数据库(MySQL,Mongdb、Redis等)或者文件中。
可以看出,正则表达式是去解析HTML数据,也就是将网页的数据转化成代码能理解的语言,后续再处理成我们想要的数据格式。就是个翻译的过程,就想英译中,有人用百度翻译,有人有网易有道,工具不同,行为一致。
接下来我们就来说说Xpath
Python使用XPath解析HTML
给大家个地址,可以看一下,写的蛮好
Python使用XPath解析HTML:从入门到精通_python xpath文档-CSDN博客
原文:XPath是一种用于选择XML文档中节点的语言,它可以通过路径表达式来定位节点。由于HTML文档的结构与XML文档类似,XPath也可以用于解析HTML文档。Python是一种非常流行的编程语言,它提供了许多库用于解析HTML文档。本文将介绍Python中使用XPath解析HTML文档的方法和技巧。
我的建议:你只需要知道XPath是一个 工具,以及怎么使用他,就想怎么用网易有道翻译外语一样,会用就行。
Xpath爬取豆瓣TOP250电源数据效果演示
源码也给到大家,copy,然后放到自己的工程里,新建一个.py就行.
import requests
import csv
from lxml import etree
# https://movie.douban.com/top250?start=0&filter=)
f = open("data1.csv", mode='w', encoding='utf-8', newline="")
# 写入的时候 会无故多出一行空行 那是因为open的时候 会自动增加一个\n ,在open的时候 newline="" 就可以了
csvwriter = csv.writer(f)
count = 0
# 通过循环读取10页数据
while count <= 225:
url = f"https://movie.douban.com/top250?start={count}&filter="
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
} # 如果代码正常却运行不出来东西,可能是请求头缺失
# 抓取页面源代码
r1 = requests.get(url, headers=header)
tree = etree.HTML(r1.text)
result = tree.xpath('/html/body/div[3]/div[1]/div/div[1]/ol')
# 重置sub
sub = 1
# 每一页有25部电影
while sub <= 25:
# 提取的数据
data_to_store = []
for i in result:
title = i.xpath(f"./li[{sub}]/div/div[2]/div[1]/a/span[1]")[0]
# print(title.text)
text = i.xpath(f"./li[{sub}]/div/div[2]/div[2]/p[1]/text()[2]")[0]
rating = i.xpath(f"./li[{sub}]/div/div[2]/div[2]/div/span[2]")[0]
votes = i.xpath(f"./li[{sub}]/div/div[2]/div[2]/div/span[4]")[0]
votes = votes.text
number = ''.join(filter(str.isdigit, votes)) #2995339人评价
# print(year) 1987/英国 意大利 中国大陆 法国/剧情 传记 历史
# 使用split方法分割文本
# 首先按'/'分割,然后按空格分割国家和类型
parts = text.split('/')
years = parts[0].strip() # 年份是第一部分
countries = parts[1].strip().split() # 国家是第二部分,用空格分割
genres = parts[2].strip().split() # 类型是第三部分,用空格分割
try: #防止第三页的情况出现
# 将提取的数据添加到列表中
movie_data = [title.text, float(rating.text), int(number), int(years), countries, genres]
data_to_store.append(movie_data)
# 写入到 data.csv 文件
with open('data1.csv', 'a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
for movie_data in data_to_store:
writer.writerow(movie_data)
except Exception as e:
pass
sub += 1
print(f"爬取完第{count/25+1}页")
count += 25
f.close()
r1.close()
print("over")
# 打开csv文件的方法:先保存到桌面,然后用记事本打开,再另存为,编码选择ANSI
我是Grace,一名爱好心理学的173通信工科女,在不断的认识自己的不足,发现自己的热爱。如有需要可联系我,QQ2642610289,探讨人生或寻找代码都行,哈哈哈哈,有时间一定回复。