社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python爬虫超详细讲解(零基础入门,老年人都看的懂)

小小的python学习社 • 2 月前 • 272 次点击  

讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)

想象一下,如果你是一个侦探,那么网络爬虫就是你的得力助手,悄无声息地在互联网的各个角落搜集线索。网络爬虫,又称网页蜘蛛或网络机器人,是一种能够模拟浏览器发送网络请求,接收响应,并按照一定规则自动抓取互联网信息的程序。

网络爬虫的定义是什么?

网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。


网络爬虫在我们的生活中扮演怎样的角色?

在数字化时代,信息如同潮水般汹涌而来。过去,我们可能依赖书籍、报纸或电视来获取信息,但这些渠道的信息量有限,而且筛选过的信息未必能满足我们的需求。如今,互联网为我们提供了海量的信息,但同时也带来了“信息过载”的问题。如何在浩如烟海的数据中找到我们真正需要的信息呢?

答案就是网络爬虫。它可以帮助我们自动化地搜集和分析信息,无论是在商业研究、市场分析、还是个人学习等方面,都有着广泛的应用。比如,商家可以利用爬虫分析竞争对手的营销策略,投资者可以用它来跟踪市场动态,学者可以收集数据进行学术研究。

在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?

毫无疑问是通过网络爬虫进行分析筛选!

通过某项技术将相关的内容收集起来,再分析筛选才能得到我们真正需要的信息。

这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。

网络爬虫技术,虽说有个诡异的名字,本能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器


如何做好网络爬虫的准备工作?

当我们提到“Python爬虫”时,可能会让人误以为只有Python才能做爬虫。其实,这是一个误解。PHP、JAVA、C#、C++等编程语言也都可以编写爬虫程序。之所以Python在爬虫领域备受欢迎,是因为它的语法简洁易读,同时拥有丰富的第三方库和工具,如requests、BeautifulSoup等,这些都能极大地简化爬虫的编写过程。

但是,无论使用哪种编程语言,编写爬虫都需要一定的技术基础和对网络协议的理解。同时,也需要注意遵守网站的robots协议和法律法规,避免对网站造成不必要的负担或侵犯他人的权益。

总之,网络爬虫是我们在大数据时代中不可或缺的数据收集助手。它能够帮助我们快速、准确地获取所需信息,为我们的工作和生活带来便利。

首先我们需要下载python,我下载的是官方最新的版本 3.8.3

其次我们需要一个Python的代码编辑器,我用的是Pychram。

下载链接:https://www.jetbrains.com/pycharm/download/#section=windows

我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)

# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  #网页解析,获取数据
import re  #正则表达式,进行文字匹配
import urllib.request, urllib.error  #制定URL,获取网页数据
import xlwt  #进行excel操作
import sqlite3 #进行SQLite数据库操作

差不多就是这几个库了,良心的我已经在后面写好注释了。


爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)


爬虫项目讲解

我们要爬取的就是这个网站:https://movie.douban.com/top250

我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息

这边我已经爬取好了,将爬取内容存入xls表中,看一下效果图:


代码分析

先把代码放上来,然后我根据代码逐步解析:

# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  # 网页解析,获取数据
import re   # 正则表达式,进行文字匹配`
import urllib.request, urllib.error  # 制定URL,获取网页数据
import xlwt  # 进行excel操作
#import sqlite3  # 进行SQLite数据库操作

findLink = re.compile(r'')  # 创建正则表达式对象,标售规则   影片详情链接的规则
findImgSrc = re.compile(r', re.S)
findTitle = re.compile(r'(.*)')
findRating = re.compile(r'(.*)')
findJudge = re.compile(r'(\d*)人评价')
findInq = re.compile(r'(.*)')
findBd = re.compile(r'

(.*?)

'
, re.S)


defmain():
    baseurl = "https://movie.douban.com/top250?start="#要爬取的网页链接
# 1.爬取网页
    datalist = getData(baseurl)
    savepath = "豆瓣电影Top250.xls"#当前目录新建XLS,存储进去
# dbpath = "movie.db"              #当前目录新建数据库,存储进去
# 3.保存数据
    saveData(datalist,savepath)      #2种存储方式可以只选择一种
# saveData2DB(datalist,dbpath)


# 爬取网页
defgetData(baseurl):
    datalist = []  #用来存储爬取的网页信息
for i inrange(010):  # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        html = askURL(url)  # 保存获取到的网页源码
# 2.逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"):  # 查找符合要求的字符串
            data = []  # 保存一部电影所有信息
            item = str(item)
            link = re.findall(findLink, item)[0]  # 通过正则表达式查找
            data.append(link)
            imgSrc = re.findall(findImgSrc, item)[0]
            data.append(imgSrc)
            titles = re.findall(findTitle, item)
if (len(titles) == 2):
                ctitle = titles[0]
                data.append(ctitle)
                otitle = titles[1].replace("/""")  #消除转义字符
                data.append(otitle)
else:
                data.append(titles[0])
                data.append(' ')
            rating = re.findall(findRating, item)[0]
            data.append(rating)
            judgeNum = re.findall(findJudge, item)[0]
            data.append(judgeNum)
            inq = re.findall(findInq, item)
iflen(inq) != 0:
                inq = inq[0].replace("。""")
                data.append(inq)
else:
                data.append(" ")
            bd = re.findall(findBd, item)[0]
            bd = re.sub('
(\s+)?'
"", bd)
            bd = re.sub('/'"", bd)
            data.append(bd.strip())
            datalist.append(data)

return datalist


# 得到指定一个URL的网页内容
defaskURL(url):
    head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent" "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }
# 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)

    request = urllib.request.Request(url, headers=head)
    html = ""
try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
except urllib.error.URLError as e:
ifhasattr(e, "code"):
print(e.code)
ifhasattr(e, "reason"):
print(e.reason)
return html


# 保存数据到表格
defsaveData(datalist,savepath):
print("save.......")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0#创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True#创建工作表
    col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
for i inrange(0,8):
        sheet.write(0,i,col[i])  #列名
for i inrange(0,250):
# print("第%d条" %(i+1))       #输出语句,用来测试
        data = datalist[i]
for j inrange(0,8):
            sheet.write(i+1,j,data[j])  #数据
    book.save(savepath) #保存

# def saveData2DB(datalist,dbpath):
#     init_db(dbpath)
#     conn = sqlite3.connect(dbpath)
#     cur = conn.cursor()
#     for data in datalist:
#             for index in range(len(data)):
#                 if index == 4 or index == 5:
#                     continue
#                 data[index] = '"'+data[index]+'"'
#             sql = '''
#                     insert into movie250(
#                     info_link,pic_link,cname,ename,score,rated,instroduction,info)
#                     values (%s)'''%",".join(data)
#             # print(sql)     #输出查询语句,用来测试
#             cur.execute(sql)
#             conn.commit()
#     cur.close
#     conn.close()


# def init_db(dbpath):
#     sql = '''
#         create table movie250(
#         id integer  primary  key autoincrement,
#         info_link text,
#         pic_link text,
#         cname varchar,
#         ename varchar ,
#         score numeric,
#         rated numeric,
#         instroduction text,
#         info text
#         )
#
#
#     '''  #创建数据表
#     conn = sqlite3.connect(dbpath)
#     cursor = conn.cursor()
#     cursor.execute(sql)
#     conn.commit()
#     conn.close()

# 保存数据到数据库



if __name__ == "__main__":  # 当程序执行时
# 调用函数
     main()
# init_db("movietest.db")
print("爬取完毕!")

下面我根据代码,从下到下给大家讲解分析一遍

-- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。

然后下面 import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。

下面一些find开头的是正则表达式,是用来我们筛选信息的。(正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)

大体流程分三步走:

  1. 爬取网页

  2. 逐一解析数据

  3. 保存网页

1.爬取网页

先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,我们来看 getData方法:

for i inrange(010):  # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)

这段大家可能看不懂,其实是这样的:

因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。

baseurl = "https://movie.douban.com/top250?start="

我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时

https://movie.douban.com/top250?start=25

我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。

然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受。

defaskURL(url):
    head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent""Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }
# 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)

    request = urllib.request.Request(url, headers=head)
    html = ""
try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
except urllib.error.URLError as e:
ifhasattr(e, "code"):
print(e.code)
ifhasattr(e, "reason"):
print(e.reason)
return html

这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?

这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码 。


418

这是一个梗大家可以百度下,

418 I'm a teapot

The HTTP 418 I'm a teapot client error response code indicates that
the server refuses to brew coffee because it is a teapot. This error
is a reference to Hyper Text Coffee Pot Control Protocol which was an
April Fools' joke in 1998.

我是一个茶壶

所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,伪装一个身份。

来,我们继续往下走,

html = response.read().decode("utf-8")

这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。访问成功后,来到了第二个流程:

2.逐一解析数据

解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。

下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的正则表达式去匹配:

findLink = re.compile(r'')  # 创建正则表达式对象,标售规则   影片详情链接的规则
findImgSrc = re.compile(r', re.S)
findTitle = re.compile(r'(.*)')
findRating = re.compile(r'(.*)')
findJudge = re.compile(r'(\d*)人评价')
findInq = re.compile(r'(.*)')
findBd = re.compile(r'

(.*?)

'
, re.S)

匹配到符合我们要求的数据,然后存进dataList, 所以 dataList 里就存放着我们需要的数据了。

最后一个流程:

3.保存数据

# 3.保存数据
saveData(datalist,savepath)      #2种存储方式可以只选择一种
# saveData2DB(datalist,dbpath)

保存数据可以选择保存到 xls 表, 需要(xlwt库支持)

也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)

这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行。

保存到 xls 的主体方法是 saveData (下面的saveData2DB方法是保存到sqlite数据库):

defsaveData(datalist,savepath):
print("save.......")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0#创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True#创建工作表
    col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
for i inrange(0,8):
        sheet.write(0,i,col[i])  #列名
for i inrange(0,250):
# print("第%d条" %(i+1))       #输出语句,用来测试
        data = datalist[i]
for j inrange(0, 8):
            sheet.write(i+1,j,data[j])  #数据
    book.save(savepath) #保存

创建工作表,创列(会在当前目录下创建):

 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True#创建工作表
 col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")

然后把 dataList里的数据一条条存进去就行。最后运作成功后,会在左侧生成这么一个文件:

打开之后看看是不是我们想要的结果:

成了,成了!

如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦

我也在不断的学习中,学到新东西第一时间会跟大家分享,大家可以动动小手,点波关注不迷路。


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

整理出了一套系统的学习路线,这套资料涵盖了诸多学习内容:开发工具,基础视频教程,项目实战源码,51本电子书籍,100道练习题等。相信可以帮助大家在最短的时间内,能达到事半功倍效果,用来复习也是非常不错的。

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python学习视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

资料获取方式:↓↓↓↓
1.关注下方公众号↓↓↓↓在后台发送:“python” 即可免费领取

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179319
 
272 次点击