[Python]网站数据爬取任务

编程入门 行业动态 更新时间:2024-10-22 08:21:27

[Python]网站<a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据爬取任务"/>

[Python]网站数据爬取任务

Python爬虫作业:网站数据爬取任务

从以下网址(包括但不限于下列网络或应用)中爬取数据,以核实的形式存储数据,并进行分析(不一定是计算机角度的分析,可写分析报告),或制作词云图。

一、文本数据

酷狗榜单: .html
百度百科:查城市,查人,查知识。

二、表格类数据

天气后报:
某城市的历史数据 .html
某城市的空气质量数据 .html
世界500强,中国老字号等:.html
股票历史数据 .php/vMS_MarketHistory/stockid/601006.phtml?year=2018&jidu=3

三、json数据

新浪股票历史数据:
.php/CN_MarketData.getKLineData?symbol=sz000001&scale=5&ma=5&datalen=1023
新闻
=113352&pgnum=1&cnt=10&tp=1&orderby=1?callback=jQuery1124031738006032386434_1556448186026&_=1556448186027
世界大学排行榜
.json

四、模拟浏览器访问

淘宝
京东
百度贴吧

用了大概七八个小时做完这些爬虫,大概过程介绍一下:

1.模拟浏览器获取html文件
2.分析html文件中的数据
3.(难点)正则处理数据
4.输出所需要的数据

一、需要的知识

(一)模拟浏览器爬虫

方法一:

import urllib.request
import re# 酷狗榜单网址
url = ".html"
# 请求
request = urllib.request.Request(url)
# 爬取结果
response = urllib.request.urlopen(request)
data = response.read()
# 设置解码方式
data = data.decode('utf-8')
# 打印结果
#print(data)
# 打印爬取网页的各类信息
#print(type(response))
#print(response.geturl())
#print(response.info())
#print(response.getcode())

方法二:

import urllib.request
import re
#世界500强
url = '.html'
#模拟header
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'}
page1=urllib.request.Request(url,headers=headers)
page=urllib.request.urlopen(page1)
#保存html数据
html=page.read()

因为有的网页不允许没有header进行GET获取,所以采用方法二机进行爬虫

(二)JSON字符串

根据json题总结出现的三种json字符串

1.key没有双引号问题:在key上添加双引号

url:.php/CN_MarketData.getKLineData?symbol=sz000001&scale=5&ma=5&datalen=1023

[{day: "2019-06-12 14:55:00",open: "12.570",high: "12.600",low: "12.570"
}, {day: "2019-06-12 15:00:00",open: "12.590",high: "12.610",low: "12.570"
}]

函数源码:

#将key没有双引号问题解决:在key上添加双引号
def jsonfy(s:str)->object:#此函数将不带双引号的json的key标准化obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))())return obj

使用:

data = jsonfy(data)

2.有多余字符的正常json字符串

url:=113352&pgnum=1&cnt=10&tp=1&orderby=1?callback=jQuery1124031738006032386434_1556448186026&_=1556448186027

jQuery1124031738006032386434_1556448186026
({"status": 0,"data": {"list": [{"DocID": 1124648170,"Title": "基层减负,切忌用官僚主义反形式主义!","NodeId": 113352,"PubTime": "2019-06-20 11:13:17","LinkUrl": ".htm","Abstract": "切忌用官僚主义反形式主义,否则,必将制造更多的形式主义。中央提倡建立容错纠错机制,哪怕有问题,也留点时间和空间给基层解释和改错。","keyword": null,"Editor": null,"Author": "底东娜","IsLink": 1,"SourceName": null,"PicLinks": "1124648170_1561000363942_title.png","IsMoreImg": 0,"imgarray": [],"SubTitle": null,"Attr": 63,"m4v": null,"tarray": [],"uarray": [],"allPics": [".png"],"IntroTitle": null,"Ext1": null,"Ext2": null,"Ext3": null,"Ext4": null,"Ext5": null,"Ext6": null,"Ext7": null,"Ext8": null,"Ext9": null,"Ext10": null}, {"DocID": 1124648174,"Title": "人造卫星“污染”星空? 天文学界的担心不是没有道理","NodeId": 113352,"PubTime": "2019-06-20 11:14:08","LinkUrl": ".htm","Abstract": "自从SpaceX发射首批星链卫星(StarLink),夜空中前所未见地显现一列“星空小火车”,在全球范围内引发一连串的疑问、担心、质疑。","keyword": null,"Editor": null,"Author": "底东娜","IsLink": 1,"SourceName": null,"PicLinks": "1124648174_1561000415037_title.jpg","IsMoreImg": 0,"imgarray": [],"SubTitle": null,"Attr": 63,"m4v": null,"tarray": [],"uarray": [],"allPics": [".jpg"],"IntroTitle": null,"Ext1": null,"Ext2": null,"Ext3": null,"Ext4": null,"Ext5": null,"Ext6": null,"Ext7": null,"Ext8": null,"Ext9": null,"Ext10": null}, "totalnum": 1000})

函数源码:
先删除无效字符

#删除多余字符串
data = data.strip('jQuery1124031738006032386434_1556448186026(.+?)')

剩下的部分是json字符串(就是常见的大家说的json传值,传的是字符串)

data = json.loads(data) #loads函数:json字符串转json对象
#data = json.dumps(data)  #dumps函数:json对象转json字符串
for j in data['data']['list']:print('DocID:',j['DocID'])print('标题:',j['Title'])print('NodeId:',j['NodeId'])print('发布时间:',j['PubTime'])print('超连接:',j['LinkUrl'])print('摘要:',j['Abstract'])print('关键字:',j['keyword'])print('编辑人:',j['Editor'])print('作者:',j['Author'])print('资源名:',j['SourceName'])print('插图文件名:',j['PicLinks'])print('是否有更多图:',j['IsMoreImg'])print('----------------------')

3.普通json字符串

{"data": [{"rank_order": "10","rank": "1","name": "University of Oxford","subjects_offered": "Computer Science,Civil Engineering,Mathematics \u0026 Statistics,Languages, Literature \u0026 Linguistics,Physics \u0026 Astronomy,Biological Sciences,General Engineering,Electrical \u0026 Electronic Engineering,Chemical Engineering,Other Health,Psychology,Politics \u0026 International Studies (incl Development Studies),History, Philosophy \u0026 Theology,Economics \u0026 Econometrics,Law,Mechanical \u0026 Aerospace Engineering,Chemistry,Sociology,Geology, Environmental, Earth \u0026 Marine Sciences,Art, Performing Arts \u0026 Design,Geography,Medicine \u0026 Dentistry"}, {"rank_order": "20","rank": "2","name": "University of Cambridge","subjects_offered": "Politics \u0026 International Studies (incl Development Studies),Languages, Literature \u0026 Linguistics,Art, Performing Arts \u0026 Design,Medicine \u0026 Dentistry,Economics \u0026 Econometrics,Mathematics \u0026 Statistics,Architecture,General Engineering,Biological Sciences,History, Philosophy \u0026 Theology,Law,Veterinary Science,Psychology,Chemical Engineering,Education,Computer Science,Geography"}]
}

既然是json字符串,那么直接使用就可以了

data = json.loads(data)
for j in data['data']:print('等级次序:',j['rank_order'])print('排名:',j['rank'])print('大学名称:',j['name'])print('----------------------')

总结:注意json字符串和json对象之间的关系,爬到的数据如果不是json字符串可以先用一些代码转换,然后直接转换成json对象,再进行使用就很方便了。

(三)正则表达式

1.介绍函数

(1)findall函数

参考:.html
本次作业中我使用的函数是findallfindall
函数说明:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
string 待匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
查找字符串中的所有数字:
实例

import repattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)print(result1)
print(result2)

输出结果:

['123', '456']
['88', '12']

(2)replace函数

 # 删除回车和空格w = w.replace("\r\n", "")

(3) compile函数

 # 删除所有<>标签dr = re.compile(r'<[^>]+>', re.S)w = dr.sub('', w)w = w.strip()

2.使用到的正则表达式

目标网站相关源码:

<table width="100%" border="0" class="b" cellpadding="1" cellspacing="1"><tr><td><b>日期</b></td><td><b>天气状况</b></td><td><b>气温</b></td><td><b>风力风向</b></td></tr><tr><td><a href='/lishi/beijing/20181001.html'title="2018年10月01日北京天气预报">2018年10月01日</a></td><td>晴/晴</td><td>25℃/12℃</td><td>西北风 4-5级/西北风 4-5级</td></tr><tr><td><a href='/lishi/beijing/20181002.html'title="2018年10月02日北京天气预报">2018年10月02日</a></td><td>晴/晴</td><td>24℃/10℃</td><td>北风 1-2级/北风 1-2级</td></tr><table>

正则语句:

#[\s\S] 意思是匹配所有 空白字符+非空白字符
pattern = r'<td.*?>([\s\S]*?)</td>'

处理数据以及输出:

#开始匹配
weather = re.findall(pattern, data, 0)
#循环输出结果for w in weather:# 删除所有<>标签dr = re.compile(r'<[^>]+>', re.S)w = dr.sub('', w)w = w.strip()# 删除回车和空格w = w.replace("\r\n", "")w = w.replace(" ", "")# 输出数据print(w)

其他正则:

pattern = r"<li class=\" \" title=\"(.+?)\" data-index="

说明:正则对我来说是个薄弱点,所以这次用了这么长时间也是因为正则出问题,所以正则不再介绍,以免引导错误,以后我会再去好好学习正则表达式,提高效率。

五、学习总结

1.BeautifulSoup是个好工具,文档链接:/
2.心里有框架再去操作!!!

更多推荐

[Python]网站数据爬取任务

本文发布于:2023-07-01 07:42:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/972771.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   网站   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!