Python爬虫实战:数据获取、解析与存储完整指南
本文详细介绍Python爬虫的核心流程,涵盖使用requests获取网页数据、利用lxml进行HTML解析,以及将数据保存为CSV文件或存入MySQL数据库的具体实现。通过完整代码示例,演示如何处理动态页面、登录状态及异常捕获,帮助开发者快速掌握网络数据采集与持久化技术。
网络爬虫的第一步是获取目标网页的数据。通常使用Python的requests库发起HTTP请求。在代码实现中,需要设置合理的User-Agent头部信息以模拟浏览器访问,避免被服务器拒绝。通过try-except结构捕获可能的网络异常,检查响应状态码是否为200,并正确设置编码格式(如apparent_encoding)以确保中文内容不乱码。若请求失败,则返回错误提示。
import requests
def drg(url):
try:
head ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\
537.36 (KHTML, like Gecko) Chrome/\
91.0.4472.164 Safari/537.36'}
r = requests.get(url,headers=head)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
url = "https://www.ip138.com/mobile.asp?mobile=13018305773&action=mobile"
print(drg(url))
对于需要登录或保持会话的网页,爬虫需处理Session状态。代码中通过requests.session()创建会话对象,在登录接口提交用户名、密码及必要的加密参数(如nonce、cnonce)。登录成功后,该会话对象会自动携带Cookie访问后续页面。获取目标页面HTML时,同样需验证状态码并处理编码,确保能正确读取页面源码。
import requests
def login():
try:
# 登录之后界面的url
urllogin="http://www.cqooc.com/user/login?username=12608199000635&password=48C032612C2A6777D28A969307B52127E198D59AA78522943C1B283CF7B89E69&nonce=6BA36BBB1F623279&cnonce=8257070573EFE28F"
s=requests.session()
r=s.post(urllogin,data=Form,headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
return s
except Exception as error:
print(error)
def get_html(s,url):
try:
r=s.get(url,headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
return r.text
except Exception as error:
print(error)
if __name__=="__main__":
# 登录之后的界面user-agent
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36",
}
# 跟着自己的改变
Form = {
"username": "12608199000635",
"password": "48C032612C2A6777D28A969307B52127E198D59AA78522943C1B283CF7B89E69",
"nonce": "6BA36BBB1F623279",
"cnonce": "8257070573EFE28F"
}
lin=login()
# 个人中心的网址
url="http://www.cqooc.com/my/learn"
html=get_html(lin,url)
print(html)
获取数据后,需将其结构化并存储。常见的存储方式包括保存为CSV文件和存入关系型数据库。这两种方式各有适用场景:CSV适合轻量级、一次性分析的数据;数据库则适合需要长期维护、查询和关联的大规模数据。
将解析后的数据保存为CSV文件是常用方法。首先使用lxml库的etree将HTML字符串转换为DOM树,通过XPath表达式定位目标元素(如书名、作者、简介等)。遍历提取所需字段,组装成列表。随后使用Python内置的csv模块,以UTF-8编码打开文件,创建写入对象,并将数据列表一次性写入文件,确保中文内容正确显示。
import requests
from lxml import etree
import csv
#获取数据
def get_html(url,time=30):
try:
r = requests.get(url, timeout=time)
r.encoding = r.apparent_encoding
r.raise_for_status()
return r.text
except Exception as error:
print(error)
def parser(html): #解析函数
doc=etree.HTML(html) #html转换为soup对象
out_list=[] #解析函数输出数据的列表
#二次查找法
for row in doc.xpath("//*[@class='book-img-text']//li/*[@class='book-mid-info']"):
row_data=[
row.xpath("h4/a/text()")[0], #书名
row.xpath("p[@class='author']/a/text()")[0], #作者
row.xpath("p[2]/text()")[0].strip(), #介绍
row.xpath("p[@class='update']/span/text()")[0] #更新日期
]
out_list.append(row_data) #将解析的每行数据插入到输出列表中
return out_list
def save_csv(item,path): #数据存储,将list数据写入文件,防止乱码
with open(path, "a+", newline='',encoding="utf-8") as f: #创建utf8编码文件
csv_write = csv.writer(f) #创建写入对象
csv_write.writerows(item) #一次性写入多行
if __name__=="__main__":
for i in range(1,6):
url="https://www.qidian.com/rank/fengyun?style=1&page={0}".format(i)
html=get_html(url) #获取网页数据
out_list=parser(html) #解析网页,输出列表数据
save_csv(out_list,"d:\\book.csv") #数据存储
将数据存入数据库(如MySQL)能提供更强大的数据管理能力。流程包括:使用pymysql库建立数据库连接,配置主机、端口、用户名、密码及字符集。在解析HTML时,通过XPath提取关键信息(如名称、评分、价格等),存入结果列表。遍历完成后,执行INSERT语句将数据批量插入数据库表中,并打印结果确认写入成功。
import pymysql
import requests
from lxml import etree
def get_html(url, time=3000):
try:
headers ={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31"
}
r = requests.get(url, timeout=time,headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
return r.text
except Exception as err:
print(err)
result = []
def parse_html(html):
html = etree.HTML(html)
for row in html.xpath('//*[@id="content"]/div/div[1]/ul/li'):
Naame = row.xpath("div[2]/h2/a/text()")[0].strip()#//*[@id="content"]/div/div[1]/ul[1]/div[2]/h2/a
score = row.xpath("div[2]/p[2]/span[2]/text()")[0].strip()#//*[@id="content"]/div/div[1]/ul[1]/div[2]/p[2]/span[2]
price = row.xpath("div[2]/p[1]/text()")[0].strip().split("/")#//*[@id="content"]/div/div[1]/ul[1]/div[2]/p[1]/text()
price= price[0]
content= price[1]
a=price[2]
b= price[-1]
detail = [Naame,score,price,content,a,b]
result.append(detail)
def join_all(sql_insert,vals,**dbinfo):
try:
connet = pymysql.connect(**dbinfo)
cursor = connet.cursor()
cursor.executemany(sql_insert,vals)
connet.commit()
print('添加成功!')
except Exception as err:
print(err)
connet.rollback()
cursor.close()
if __name__=="__main__":
for page in range(1,16):
url="https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p={0}".format(str(page))
parms ={
"host":"127.0.0.1",
"port":3306,
"user":"root",
"passwd":"123456",
"db":"db",
"charset":"utf8"
}
html=get_html(url)
parse_html(html)
sql_insert = "INSERT INTO db(Naame,score,price,content,a,b)\
Values(%s,%s,%s,%s,%s,%s)"
join_all(sql_insert,result,**parms)
print(result)
本文系统讲解了Python爬虫从数据抓取、解析到存储的全流程。通过具体代码示例,展示了如何处理普通页面、需登录页面,以及如何将数据保存为CSV或存入MySQL数据库。掌握这些技术,可有效提升数据采集效率与数据管理能力。
希望本文能为您提供帮助。如果您对Python爬虫技术感兴趣,欢迎持续关注本站,获取更多关于编程、数据抓取及数据库应用的最新教程与资源。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













