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处理cookie详解
Feb 07 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
javascript函数库-集合框架
2007/04/27 Javascript
js中有关IE版本检测
2012/01/04 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
sails框架的学习指南
2014/12/22 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
Python3中使用PyMongo的方法详解
2017/07/28 Python
python去除扩展名的实例讲解
2018/04/23 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python如何删除文件、目录
2020/06/23 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
中国央视网签名寄语
2014/01/18 职场文书
农业开发项目建议书
2014/05/16 职场文书
汽车维修求职信
2014/06/15 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
购房个人委托书范本
2014/10/11 职场文书
手术室护士个人总结
2015/02/13 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
担保书格式范文
2015/09/22 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript