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聊天程序实例代码分享
Nov 18 Python
python装饰器使用方法实例
Nov 21 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
python实现中文转换url编码的方法
Jun 14 Python
Python爬取网易云音乐热门评论
Mar 31 Python
Python元组知识点总结
Feb 18 Python
python实现图片中文字分割效果
Jul 22 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
Python能做什么
Jun 02 Python
pandas中DataFrame检测重复值的实现
May 26 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
ajax在joomla中的原生态应用代码
2012/07/19 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jquery.validate使用详解
2016/06/02 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
Vue表单实例代码
2016/09/05 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python的slice notation的特殊用法详解
2019/12/27 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
自荐信格式简述
2014/01/25 职场文书
校运会入场式解说词
2014/02/10 职场文书
车辆工程专业求职信
2014/04/28 职场文书
小学课外活动总结
2014/07/09 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle