python爬虫使用正则爬取网站的实现
作者:渣渣林 发布时间:2021-09-10 10:39:11
本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。
本文章是自己学习的一些记录。欢迎各位大佬点评!
首先
今天是第一天写博客,感受到了博客的魅力,博客不仅能够记录每天的代码学习情况,并且可以当作是自己的学习笔记,以便在后面知识点不清楚的时候前来复习。这是第一次使用爬虫爬取网页,这里展示的是爬取豆瓣电影top250的整个过程,欢迎大家指点。
这里我只爬取了电影链接和电影名称,如果想要更加完整的爬取代码,请联系我。qq 1540741344 欢迎交流
开发工具: pycharm、chrome
分析网页
在开发之前你首先要去你所要爬取的网页提取出你要爬取的网页链接,并且将网页分析出你想要的内容。
在开发之前首先要导入几个模块,模块描述如下,具体不知道怎么导入包的可以看我下一篇内容
首先定义几个函数,便于将各个步骤的工作分开便于代码管理,我这里是分成了7个函数,分别如下:
@主函数入口
if __name__=="__main__": #程序执行入口
main()
@捕获网页html内容 askURL(url)
这里的head的提取是在chrome中分析网页源码获得的,具体我也不做过多解释,大家可以百度
def askURL(url): #得到指定网页信息的内容 #爬取一个网页的数据
# 用户代理,本质上是告诉服务器,我们是以什么样的机器来访问网站,以便接受什么样的水平数据
head={"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 84.0.4147.89 Safari / 537.36"}
request=urllib.request.Request(url,headers=head) #request对象接受封装的信息,通过urllib携带headers访问信息访问url
response=urllib.request.urlopen(request) #用于接收返回的网页信息
html=response.read().decode("utf-8") #通过read方法读取response对象里的网页信息,使用“utf-8”
return html
@将baseurl里的内容进行逐一解析 getData(baseURL)
这里面的findlink和findname是正则表达式,可以首先定义全局变量
findlink=r'<a class="" href="(.*?)"'
findname=r'<span class="title">(.*?)</span>'
def getData(baseURL):
dataList=[] #初始化datalist用于存储获取到的数据
for i in range(0,10):
url=baseURL+str(i*25)
html=askURL(url) #保存获取到的源码
soup=BeautifulSoup(html,"html.parser") #对html进行逐一解析,使用html.parser解析器进行解析
for item in soup.find_all("div",class_="item"): #查找符合要求的字符串 ,形成列表,find_all是查找所有的class是item的div
data=[] #初始化data,用于捕获一次爬取一个div里面的内容
item=str(item) #将item数据类型转化为字符串类型
# print(item)
link=re.findall(findlink,item)[0] #使用re里的findall方法根据正则提取item里面的电影链接
data.append(link) #将网页链接追加到data里
name=re.findall(findname,item)[0] #使用re里的findall方法根据正则提取item里面的电影名字
data.append(name) #将电影名字链接追加到data里
# print(link)
# print(name)
dataList.append(data) #将捕获的电影链接和电影名存到datalist里面
return dataList #返回一个列表,里面存放的是每个电影的信息
print(dataList)
@保存捕获的数据到excel saveData(dataList,savepath)
def saveData(dataList,savepath): #保存捕获的内容到excel里,datalist是捕获的数据列表,savepath是保存路径
book=xlwt.Workbook(encoding="utf-8",style_compression=0)#初始化book对象,这里首先要导入xlwt的包
sheet=book.add_sheet("test",cell_overwrite_ok=True) #创建工作表
col=["电影详情链接","电影名称"] #列名
for i in range(0,2):
sheet.write(0,i,col[i]) #将列名逐一写入到excel
for i in range(0,250):
data=dataList[i] #依次将datalist里的数据获取
for j in range(0,2):
sheet.write(i+1,j,data[j]) #将data里面的数据逐一写入
book.save(savepath)
@保存捕获的数据到数据库
def saveDataDb(dataList,dbpath):
initDb(dbpath) #用一个函数初始化数据库
conn=sqlite3.connect(dbpath) #初始化数据库
cur=conn.cursor() #获取游标
for data in dataList:
for index in range(len(data)):
data[index]='"'+data[index]+'" ' #将每条数据都加上""
#每条数据之间用,隔开,定义sql语句的格式
sql='''
insert into test(link,name) values (%s)
'''%','.join (data)
cur.execute(sql) #执行sql语句
conn.commit() #提交数据库操作
conn.close()
print("爬取存入数据库成功!")
@初始化数据库 initDb(dbpath)
def initDb(dbpath):
conn=sqlite3.connect(dbpath)
cur=conn.cursor()
sql='''
create table test(
id integer primary key autoincrement,
link text,
name varchar
)
'''
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
@main函数,用于调用其他函数 main()
def main():
dbpath="testSpider.db" #用于指定数据库存储路径
savepath="testSpider.xls" #用于指定excel存储路径
baseURL="https://movie.douban.com/top250?start=" #爬取的网页初始链接
dataList=getData(baseURL)
saveData(dataList,savepath)
saveDataDb(dataList,dbpath)
点击运行就可以看到在左侧已经生成了excel和DB文件
excel可以直接打开
DB文件双击之后会在右边打开
到这里爬虫的基本内容就已经结束了,如果有什么不懂或者想交流的地方可以加我qq 1540741344
以下附上整个代码
import re #网页解析,获取数据
from bs4 import BeautifulSoup #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt
import sqlite3
findlink=r'<a class="" href="(.*?)"'
findname=r'<span class="title">(.*?)</span>'
def main():
dbpath="testSpider.db" #用于指定数据库存储路径
savepath="testSpider.xls" #用于指定excel存储路径
baseURL="https://movie.douban.com/top250?start=" #爬取的网页初始链接
dataList=getData(baseURL)
saveData(dataList,savepath)
saveDataDb(dataList,dbpath)
def askURL(url): #得到指定网页信息的内容 #爬取一个网页的数据
# 用户代理,本质上是告诉服务器,我们是以什么样的机器来访问网站,以便接受什么样的水平数据
head={"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 84.0.4147.89 Safari / 537.36"}
request=urllib.request.Request(url,headers=head) #request对象接受封装的信息,通过urllib携带headers访问信息访问url
response=urllib.request.urlopen(request) #用于接收返回的网页信息
html=response.read().decode("utf-8") #通过read方法读取response对象里的网页信息,使用“utf-8”
return html #返回捕获的网页内容,此时还是未处理过的
def getData(baseURL):
dataList=[] #初始化datalist用于存储获取到的数据
for i in range(0,10):
url=baseURL+str(i*25)
html=askURL(url) #保存获取到的源码
soup=BeautifulSoup(html,"html.parser") #对html进行逐一解析,使用html.parser解析器进行解析
for item in soup.find_all("div",class_="item"): #查找符合要求的字符串 ,形成列表,find_all是查找所有的class是item的div
data=[] #初始化data,用于捕获一次爬取一个div里面的内容
item=str(item) #将item数据类型转化为字符串类型
# print(item)
link=re.findall(findlink,item)[0] #使用re里的findall方法根据正则提取item里面的电影链接
data.append(link) #将网页链接追加到data里
name=re.findall(findname,item)[0] #使用re里的findall方法根据正则提取item里面的电影名字
data.append(name) #将电影名字链接追加到data里
# print(link)
# print(name)
dataList.append(data) #将捕获的电影链接和电影名存到datalist里面
return dataList #返回一个列表,里面存放的是每个电影的信息
print(dataList)
def saveData(dataList,savepath): #保存捕获的内容到excel里,datalist是捕获的数据列表,savepath是保存路径
book=xlwt.Workbook(encoding="utf-8",style_compression=0)#初始化book对象,这里首先要导入xlwt的包
sheet=book.add_sheet("test",cell_overwrite_ok=True) #创建工作表
col=["电影详情链接","电影名称"] #列名
for i in range(0,2):
sheet.write(0,i,col[i]) #将列名逐一写入到excel
for i in range(0,250):
data=dataList[i] #依次将datalist里的数据获取
for j in range(0,2):
sheet.write(i+1,j,data[j]) #将data里面的数据逐一写入
book.save(savepath) #保存excel文件
def saveDataDb(dataList,dbpath):
initDb(dbpath) #用一个函数初始化数据库
conn=sqlite3.connect(dbpath) #初始化数据库
cur=conn.cursor() #获取游标
for data in dataList:
for index in range(len(data)):
data[index]='"'+data[index]+'" ' #将每条数据都加上""
#每条数据之间用,隔开,定义sql语句的格式
sql='''
insert into test(link,name) values (%s)
'''%','.join (data)
cur.execute(sql) #执行sql语句
conn.commit() #提交数据库操作
conn.close()
print("爬取存入数据库成功!")
def initDb(dbpath):
conn=sqlite3.connect(dbpath)
cur=conn.cursor()
sql='''
create table test(
id integer primary key autoincrement,
link text,
name varchar
)
'''
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
if __name__=="__main__": #程序执行入口
main()
来源:https://blog.csdn.net/qq_48736958/article/details/107726283


猜你喜欢
- ndarray 的数据类型数据类型,即 dtype ,也是一个特殊的对象, 它包含了ndarray需要为某一种类型数据所申明的内存块信息(也
- 1.初探刚开始接触go时,以为import自定义包与Java工程类似,在非GOPATH的路径中新建了一个go项目HelloGo,如下:接下来
- 实际的项目网站中或多或少的或用到多选框,我选用的一款是 Bootstrap Multiselect。 官
- 1、前言拖拽排序对于小伙伴们来说应该不陌生,平时工作的时候,可能会选择使用类似Sortable.js这样的开源库来实现需求。但在完成需求后,
- 初学python,我们必须干点有意思的事!从微信下手吧!头像集样例如下: 大家可以发朋友圈开启辨认大赛哈哈~话不多说,直接上代码,注释我写了
- 前言记录CS2000设备使用串口连接以及相关控制。CS2000是一台分光辐射亮度计,也就是可以测量光源的亮度。详细的规格网址参考CS2000
- 通常程序会被编写为一个顺序执行并完成一个独立任务的代码。如果没有特别的需求,最好总是这样写代码,因为这种类型的程序通常很容易写,也很容易维护
- QWidget基本介绍基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类。窗口坐
- pytorch和numpy默认浮点类型位数numpy中默认浮点类型为64位,pytorch中默认浮点类型位32位测试代码如下numpy版本:
- 由于最近测试需要录制系统界面的操作过程,因为都是全屏的操作,所以用python做一个简单的录屏小工具。实现过程也是比较简单,就是通过对屏幕操
- 当用户访问一个网站的时候,第一屏的信息展示是非常重要的,很大程度上影响了用户是否决定停留,然而光靠文字大面积的堆积,很难直观而迅速的告诉用户
- 一、安装库需要安装pywin32库pip install pywin32二、代码原理WPS高清图片导出需要会员,就为了一个这个小需求开一个会
- 利用Python OpenCV中的 cv.Resize(源,目标,变换方法)就可以实现变换为想要的尺寸了源文件:就不用说了目标:你可以对图像
- Cloudflare 有一项功能挺不错的,就是将页面上所有的邮箱地址都加密起来,防止机器人抓到然后干坏事。这项功能要在后台开启 email
- pyecharts介绍pyecharts是python与echarts链接,一个用于生成Echarts图标的第三方库,pyecharts分为
- python实现的五子棋,能够自动判断输赢,没有是实现电脑对战功能源码下载:pygame五子棋# 1、引入pygame 和 pygame.l
- 前言python 中 if 的用法(if else, if not, elif)if语句实际上是:if True: …
- 本文实例为大家分享了js实现简单图片轮播的具体代码,最终实现效果图代码块<!DOCTYPE html><html>
- 首先,将FileToZip.class文件放到ThinkPHP/Extend/Library/ORG/Util/文件夹中,FileToZip
- 1.先引入switchery.css 和 switchery.js2.绘制 checkbox按钮 : a.静态页面写法 未选中时