今天主要来介绍一下爬虫的三种处理数据方法,希望对大家有所帮助.
在进行数据处理之前,我们有必要的知道数据是怎么分类的
非结构化的数据:html
处理方法:正则表达式.xpath
结构化数据:json,xml等
处理方法:转化为python数据类型
一.爬虫数据-json数据处理
数据提取之json
JSON是一种轻量级的数据交换式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行生成.适用于进行数据交互的场景,比如网站前台与后台之间的数据交互
数据转化:
json字符串———————–json.loads()——————->python数据类型
python数据类型———————–json.dumps()——————->json字符串
包含json的类文件对象——————–json.load()—————–>python数据类型
python数据类型———————–json.dump()—————>包含json的类文件对象
import json import requests from h01 import parse_url from pprint import pprint
url = "https://m.douban.com/rexxar/api/v2/movie/hot_channels?for_mobile=1" html_str = parse_url(url)
# json.loads把json字符串转化为python类型 ret1 = json.loads(html_str) pprint(ret1) print(type(ret1))
# json.dumps把python类型转化为json字符串 with open("douban.json", "w", encoding = "utf-8") as f: f.write(json.dumps(ret1, ensure_ascii=False, indent=2)) # f.write(str(ret1))
import requests import json
class DouBanSpider: def __init__(self): self.url_temp_list = [
{ "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?&start={}&count=18&loc_id=108288", "country": "US" },
{ "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_korean/items?&start={}&count=18&loc_id=108288", "country": "KR" }
]
self.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 " "Mobile Safari/537.36", "Referer": "https://m.douban.com/tv/korean"}
def parse_url(self, url): print(url) response = requests.get(url, headers=self.headers) return response.content.decode()
def get_content_list(self, json_str): # 提取数据 dict_ret = json.loads(json_str) content_list = dict_ret["subject_collection_items"] total = dict_ret["total"] return content_list, total
def save_content_list(self, content_list, country): # 保存数据 with open("douban.txt", "a", encoding="utf-8") as f: for content in content_list: content["country"] = country f.write(json.dumps(content, ensure_ascii=False)) f.write("n") print("保存成功")
def run(self): # 实现主要逻辑 for url_temp in self.url_temp_list: num = 0 total = 100 # 假设有第一页 while num < total + 18: # 1.start_url url = url_temp["url_temp"].format(num) # 2.发送请求,获取响应 json_str = self.parse_url(url) # 3.提取数据 content_list, total = self.get_content_list(json_str) # 4.保存 self.save_content_list(content_list, url_temp["country"]) # if len(content_list)<18: # break # 5.构造下一页的url地址,进入循环 num += 18
if __name__ == '__main__': doubanspider = DouBanSpider() doubanspider.run()
二.爬虫数据-正则处理数据
使用正则爬取段子网第一页
import requests import re import json
class DuanZi: def __init__(self): self.start_url = "http://duanziwang.com/page/2/" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36"}
def parse_url(self, url): # 发送请求 response = requests.get(url, headers=self.headers) return response.content.decode()
def get_first_page_content_list(self, html_str): content_list = re.findall(r"<p>(.*?)</p>", html_str, re.S) return content_list
def save_content_list(self, content_list): # 保存 with open("duanzi.txt", "a", encoding="utf-8") as f: for content in content_list: f.write(json.dumps(content, ensure_ascii=False)) f.write("/n") print("保存成功")
def run(self): # 实现主要逻辑 # 1.start_url # 2.发送请求,获取响应 html_str = self.parse_url(self.start_url) # 3.提取数据 content_list = self.get_first_page_content_list(html_str) # 4.保存 self.save_content_list(content_list)
if __name__ == '__main__': duanzi = DuanZi() duanzi.run()
三.爬虫数据-xpath处理数据
XPATH和LXML类库
为什么要学习XPATH和LXML类库:
lxml是一款高性能的Python HTML/XML解析器,我们可以利用XPath,来快捷的定位特定元素以及获取节点信息。
什么是XPATH:
XPath(XML Path Language)是一门在HTML/XML文档中查找信息的语言,可以用在HTML/XML文档中对元素和属性进行遍历。
认识XML
XML:(可扩展标记语言)被设计为传输和存储数据,其焦点是数据的内容。
HTML:(超文本标记语言)显示数据以及如何更好显示数据。
xpath学习重点
使用xpath helper或者是chrome中的copy xpath都是从elements中提取的数据,但是爬虫获取的是url对应的响应,往往和elements不同。
– 获取文本
‘a/text()’ 获取a下的文本
'a//text()'获取a下的所有标签的文本
‘//a[text()=“下一页”]’ 选择文本为下一页三个字的a标签
– @符号
‘@/@herf’
‘//ul[@id=“detail-list”]’
– //
在xpath开始的时候表示从当前html中任意位置开始选择
‘li//a’ 表示的是li下任意一个a标签
lxml库
使用入门:
导入lxml的etree库:from lxml import etree
利用etree.HTML,将字符串转化为Element对象
Element对象具有xpath的方法:html = etree.HTML(text)
lxml可以自动修正html代码。
lxml使用注意点
- lxml能够修正HTML代码,但是可能会改错了
使用etree.tostring观察修正之后的html的样子,根据修改之后的html字符串写xpath - lxml 能够接收bytes和str的字符串
- 提取页面数据的思路
先分组,渠道一个包含分组标签的列表
遍历,取其中每一组进行数据的提取,不会造成数据的对应错乱
from lxml import etree
text = ''' <div> <ul> <li class="item-1"><a>first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1"><a href="link4.html">fourth item</a></li> <li class="item-0"><a href="link5.html">fifth item</a> </ul> </div> '''
html = etree.HTML(text) print(html) # 查看element对象中包含的字符串 # print(etree.tostring(html).decode())
# 获取class为item-1 li标签下的a的href ret1 = html.xpath("//li[@class = 'item-1']/a/@href") print(ret1)
# 获取class为item-1 li标签下的a的文本 ret2 = html.xpath("//li[@class = 'item-1']/a/text()") print(ret2)
# 每个li是一条新闻,把url和文本组成字典 # for href in ret1: # item = {} # item["href"] = href # item["title"] = ret2[ret1.index(href)] # print(item)
print("*" * 50) ret3 = html.xpath("//li[@class = 'item-1']") print(ret3)
for i in ret3: item = dict() item["title"] = i.xpath("./a/text()")[0] if len(i.xpath("./a/text()")) > 0 else None item["href"] = i.xpath("./a/@href")[0] if len(i.xpath("./a/@href")) > 0 else None print(item)
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试