excel抓取网页数据(Python基础学习03——爬虫网站项目项目介绍及项目 )
优采云 发布时间: 2022-02-03 08:02excel抓取网页数据(Python基础学习03——爬虫网站项目项目介绍及项目
)
文章目录
3.2、获取数据
3.3、分析数据
3.4、保存数据
系列文章
Python学习01-Python基础
Python库学习——urllib学习
Python库学习——BeautifulSoup4学习
Python库学习——Re正则表达式
Python库学习——Excel存储(xlwt、xlrd)
Python学习02——Python爬虫
Python库学习——Flask基础学习
Python学习03——爬虫网站项目
二、Python爬虫1、任务介绍
爬虫的学习以任务驱动的方式进行,最终实现了豆瓣250大电影的基本信息爬取,包括电影名称、豆瓣评分、评价数、电影摘要、电影链接等。之后会以可视化的方式展示出来,比如统计图表。
豆瓣Top250网站:
2、爬虫介绍
网络爬虫是根据特定规则自动爬取互联网信息的程序或脚本。由于互联网数据的多样性和资源的有限性,根据用户需求对相关网页进行爬取和分析已成为主流的爬取策略。
我们可以爬取我们想看的视频和各种图片,只要是可以通过浏览器访问的数据都可以用爬虫爬取。这并不是说视频网站上只有VIP才能观看的视频可以爬取,而是我们可以通过浏览器本身观看。除非启用 VIP,否则我们仍然无法访问这些特定视频。
模拟浏览器打开网页,在网页中获取我们想要的具体数据。
爬虫原理:因为每个网页实际上都是一个HTML,里面有各种超链接,所以爬虫跟随超链接访问下一个网页。
3、基本流程
通过浏览器查看和分析目标页面,了解编程的基本规范。
通过 HTTP 库向目标站点发起请求。该请求收录其他标头和其他信息。如果服务器正常响应,会得到一个Response,就是要获取的页面内容。
获取的内容可以是HTML、JSON等格式。在这种情况下,使用页面解析库、正则表达式等进行解析。
保存形式多,可保存为文本、数据库或特定格式文件(Excel)
3.1、准备
这里我们先进入豆瓣Top250,分析一下每次翻页后的URL格式。
第一页:
第二页:
第三页:
注意:初次访问的第一页没有?top250?开始=0&过滤器=。最后的&filter=省略也可以正常访问。
3.1.1、分析页面
使用Charome开发者工具(按F12进入,其他浏览器类似)分析网页,在Elments下找到需要的数据位置。
当我们点击一个链接时,浏览器会向服务器发出请求
3.1.2、编码规范
1# -*- coding:utf-8 或者 # coding=utf-8
2
3
这样就可以在代码中收录中文,以免乱码。
1"""
2 程序输出:
3 hello 2
4 hello 1
5 __main__的意义:
6 程序会依次调用 test(2) 和 test(1),因为python是解释型语言,会按顺序执行。
7 为了使函数调用整齐有序,我们在__main__之前定义函数,在__main__中去调用。
8 约定俗成我们都从main开始执行。
9"""
10
11def main(a):
12 print("hello", a)
13
14test(2)
15
16if __name__ == "__main__":
17 main(1)
18
19
3.1.3、导入模块
这里要导入的第三方模块有:bs4、re、urllib、xlwt
在 Python 中导入第三方模块有两种方法,在命令行终端中使用 pip 或在 PyCharm 中导入。
1import re # 正则表达式,用于文字匹配
2from bs4 import BeautifulSoup # 用于网页解析,对HTML进行拆分,方便获取数据
3import urllib.request, urllib.error # 用于指定URL,给网址就能进行爬取
4import xlwt # 用于Excel操作
5import sqlite3 # 用于进行SQLite数据库操作
6
7
3.1.4、程序流程
这里先说大体思路,然后一步一步实现。
1# -*- coding = utf-8 -*-
2# @Time : 2021/7/3 6:33 下午
3# @Author : 张城阳
4# @File : main.py
5# @Software : PyCharm
6
7import re # 正则表达式,用于文字匹配
8from bs4 import BeautifulSoup # 用于网页解析,对HTML进行拆分,方便获取数据
9import urllib.request, urllib.error # 用于指定URL,给网址就能进行爬取
10import xlwt # 用于Excel操作
11import sqlite3 # 用于进行SQLite数据库操作
12
13
14def main():
15 # 豆瓣Top250网址(末尾的参数 ?start= 加不加都可以访问到第一页)
16 baseUrl = "https://movie.douban.com/top250?start="
17 # 1. 爬取网页并解析数据
18 dataList = getData(baseUrl)
19 # 2. 保存数据(以Excel形式保存)
20 savePath = ".\\豆瓣电影Top250.xls"
21 saveData(savePath)
22
23
24# 爬取网页,返回数据列表
25def getData(baseurl):
26 dataList = []
27 # 爬取网页并获取需要的数据
28 pass
29 # 对数据逐一解析
30 pass
31 # 返回解析好的数据
32 return dataList
33
34
35# 保存数据
36def saveData(savePath):
37 pass
38
39
40# 程序入口
41if __name__ == "__main__":
42 # 调用函数
43 main()
44
45
3.2、获取数据
Python一般使用urllib库来获取页面(Python2是urllib2,Python3集成了urllib和urllib2)。对于urllib,可以看另外一篇博客Python第三方库——urllib学习。
1# 得到一个指定URL的网页内容
2def askURL(url):
3 # 模拟头部信息,像豆瓣服务器发送消息
4 # User-Agent 表明这是一个浏览器(这个来自谷歌浏览器F12里 Network中 Request headers的User-Agent)
5 # 每个人的用户代理可能不相同,用自己的就好。不要复制错了,否则会报418状态码。
6 head = {
7 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
8 }
9 # 封装头部信息
10 request = urllib.request.Request(url, headers=head)
11 html = ""
12 try:
13 # 发起请求并获取响应
14 response = urllib.request.urlopen(request)
15 # 读取整个HTML源码,并解码为UTF-8
16 html = response.read().decode("utf-8")
17 except urllib.error.URLError as e:
18 # 异常捕获
19 if hasattr(e, "code"):
20 print("状态码:", e.code)
21 if hasattr(e, "reason"):
22 print("原因:", e.reason)
23 return html
24
25
26# 爬取网页,返回数据列表
27def getData(baseurl):
28 dataList = []
29 # 爬取所有网页并获取需要的HTML源码
30 for i in range(0, 10): # 豆瓣Top250 共有10页,每页25条。 range(0,10)的范围是[0,10)。
31 url = baseurl + str(i*25) # 最终 url = https://movie.douban.com/top250?start=225
32 html = askURL(url) # 将每个页面HTML源码获取出来
33 # 对页面源码逐一解析
34 pass
35 # 返回解析好的数据
36 return dataList
37
38
3.3、分析数据
现在开始解析获得的 HTML 源代码。根据观察,每部电影的信息是由
包,收录电影名、详情链接、图片链接等,需要用到正则表达式re库。关于re库,可以看我的另一篇博客,Python库学习——Re正则表达式。
这是电影《肖申克的救赎》的 HTML:
1
2
3 1
4
5
7
8
9
10
11
12 肖申克的救赎
13 / The Shawshank Redemption
14 / 月黑高飞(港) / 刺激1995(台)
15
16
17
18 [可播放]
19
20
21
22 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...
23 1994 / 美国 / *敏*感*词* 剧情
24
25
26
27
28 9.7
29
30 2385802人评价
31
32
33 希望让人自由。
34
35
36
37
38
39
下面是解析数据的代码:(为了方便观察,这里只解析第一页,把range(0, 1)改成range(0, 10)就是10页)。
<p>1# 正则表达式:.表示任意字符,*表示0次或任意次,?表示0次或1次。(.*?)惰性匹配。
2findLink = re.compile(r'<a href="(.*?)">') # 获取电影详情链接。
3findImg = re.compile(r'