python爬虫使用正则爬取网站的实现


Posted in Python onAugust 03, 2020

本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。

本文章是自己学习的一些记录。欢迎各位大佬点评!

首先

今天是第一天写博客,感受到了博客的魅力,博客不仅能够记录每天的代码学习情况,并且可以当作是自己的学习笔记,以便在后面知识点不清楚的时候前来复习。这是第一次使用爬虫爬取网页,这里展示的是爬取豆瓣电影top250的整个过程,欢迎大家指点。

这里我只爬取了电影链接和电影名称,如果想要更加完整的爬取代码,请联系我。qq 1540741344 欢迎交流

开发工具: pycharm、chrome

分析网页

在开发之前你首先要去你所要爬取的网页提取出你要爬取的网页链接,并且将网页分析出你想要的内容。

在开发之前首先要导入几个模块,模块描述如下,具体不知道怎么导入包的可以看我下一篇内容

python爬虫使用正则爬取网站的实现

首先定义几个函数,便于将各个步骤的工作分开便于代码管理,我这里是分成了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文件

python爬虫使用正则爬取网站的实现

excel可以直接打开

python爬虫使用正则爬取网站的实现

DB文件双击之后会在右边打开

python爬虫使用正则爬取网站的实现

到这里爬虫的基本内容就已经结束了,如果有什么不懂或者想交流的地方可以加我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()

到此这篇关于python爬虫使用正则爬取网站的实现的文章就介绍到这了,更多相关python正则爬取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用实例分析Python中method的参数传递过程
Apr 02 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
Php多进程实现代码
May 07 Python
python实现人人自动回复、抢沙发功能
Jun 08 Python
python语言元素知识点详解
May 15 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
Python的property属性详细讲解
Apr 11 Python
python获取整个网页源码的方法
Aug 03 #Python
flask开启多线程的具体方法
Aug 02 #Python
基于opencv实现简单画板功能
Aug 02 #Python
django下创建多个app并设置urls方法
Aug 02 #Python
Django如何在不停机的情况下创建索引
Aug 02 #Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 #Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 #Python
You might like
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP中的use关键字概述
2014/07/23 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
python基于socket实现网络广播的方法
2015/04/29 Python
详细讲解Python中的文件I/O操作
2015/05/24 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
体育教师工作总结的自我评价
2013/10/10 职场文书
自我鉴定怎么写
2013/12/05 职场文书
元旦获奖感言
2014/03/08 职场文书
园艺师求职信
2014/03/10 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
低碳环保标语
2014/06/12 职场文书
世界文化遗产导游词
2015/02/13 职场文书
就业导师推荐信范文
2015/03/27 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android