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

 更新时间:2020年08月03日 08:34:32   作者:渣渣林  
这篇文章主要介绍了python爬虫使用正则爬取网站的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

首先

今天是第一天写博客,感受到了博客的魅力,博客不仅能够记录每天的代码学习情况,并且可以当作是自己的学习笔记,以便在后面知识点不清楚的时候前来复习。这是第一次使用爬虫爬取网页,这里展示的是爬取豆瓣电影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()

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

相关文章

  • 一个基于flask的web应用诞生 用户注册功能开发(5)

    一个基于flask的web应用诞生 用户注册功能开发(5)

    一个基于flask的web应用诞生第五篇,这篇文章主要介绍了用户注册功能开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Python如何处理JSON数据详解

    Python如何处理JSON数据详解

    读取json数据实际上是把json格式变成python中字典、列表等格式化的数据,极大地方便索引查找,下面这篇文章主要给大家介绍了关于Python如何处理JSON数据的相关资料,需要的朋友可以参考下
    2022-10-10
  • python itchat实现调用微信接口的第三方模块方法

    python itchat实现调用微信接口的第三方模块方法

    这篇文章主要介绍了python itchat实现调用微信接口的第三方模块方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python项目文件中安装 setup.py的步骤

    Python项目文件中安装 setup.py的步骤

    大家都知道setup.py是python模块分发与安装的指导文件,这篇文章主要介绍了Python项目文件中如何安装 setup.py,需要的朋友可以参考下
    2023-05-05
  • python启动应用程序和终止应用程序的方法

    python启动应用程序和终止应用程序的方法

    今天小编就为大家分享一篇python启动应用程序和终止应用程序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Tensorflow中的placeholder和feed_dict的使用

    Tensorflow中的placeholder和feed_dict的使用

    这篇文章主要介绍了Tensorflow中的placeholder和feed_dict的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 详解Matplotlib绘图之属性设置

    详解Matplotlib绘图之属性设置

    这篇文章主要介绍了详解Matplotlib绘图之属性设置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • OpenCV-Python实现图像平滑处理操作

    OpenCV-Python实现图像平滑处理操作

    图像平滑处理的噪声取值主要有6种方法,本文主要介绍了这6种方法的具体使用并配置实例方法,具有一定的参考价值,感兴趣的可以了解一下
    2021-06-06
  • 在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解

    今天小编就为大家分享一篇在Pycharm中对代码进行注释和缩进的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃

    一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃

    这篇文章主要介绍了一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论