文章目录

  • 系列文章
  • 二、Python 爬 虫
    • 1、任务介绍
    • 2、简介
    • 3、基本流程
      • 3.1、准备工作
        • 3.1.1、分析页面
        • 3.1.2、编码规范
        • 3.1.3、导入模块
        • 3.1.4、程序流程
      • 3.2、获取数据
      • 3.3、解析数据
      • 3.4、保存数据
        • 3.4.1、Excel表存储
        • 3.4.1、SQLite数据库保存

系列文章

Python 学习 01 —— Python基础
Python 库学习 —— urllib 学习
Python 库学习 —— BeautifulSoup4学习
Python 库学习 —— Re 正则表达式
Python 库学习 —— Excel存储(xlwt、xlrd)
Python 学习 02 —— Python如何爬取数据
Python 库学习 —— Flask 基础学习
Python 学习03 —— 爬虫网站项目


二、Python 爬 虫

1、任务介绍

爬虫的学习按照任务驱动的方式进行,最终实现douban电影Top250的基本信息抓取,包括电影的名称、douban评分、评价数、电影概括、电影链接等。后续会再以可视化的方式展现,比如统计图。

电影Top250网址:https://movie.douban.com/top250

2、简介

  • 是什么

    网络爬虫是一种按照特定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,如今根据用户需求定向抓取相关网页并分析已经成为了主流的爬取策略。

  • 能做什么

    我们可以爬取自己想看的视频、各种图片,只要是能够通过浏览器访问的数据都可以用它进行爬取。这里并不是说能爬取视频网站上的VIP才能看的视频,而是本身我们就能通过浏览器看,除非开VIP,否则还是没法访问到那些特定视频。

  • 本质

    模拟浏览器打开网页,获取网页中我们想要的特定数据。

    原理:因为每个网页其实就是一个HTML,里面有各种超链接,我们可以顺着超链接进而访问下一个网页。

3、基本流程

  • 准备工作

    通过浏览器查看分析目标网页,学习编程基础规范。

  • 获取数据

    通过HTTP库向目标站点发起请求,请求包含额外的header等信息,若服务器正常响应就会得到一个Response,这便是所要获取的页面内容。

  • 解析内容

    得到的内容可能是HTML、JSON等格式,这时就要用到页面解析库、正则表达式等进行解析。

  • 保存数据

    保存形式很多,可以保存为文本、数据库或是特定格式的文件(Excel)

3.1、准备工作

这里我们先进入doubanTop250分析下每次翻页后URL的格式。

第一页:https://movie.douban.com/top250?start=0&filter=

第二页:https://movie.douban.com/top250?start=25&filter=

第三页:https://movie.douban.com/top250?start=50&filter=

注意:初始访问第一页是没有?top250?start=0&filter=。最后的&filter=省略也能正常访问。

3.1.1、分析页面

借助Charome开发者工具(按F12进入,其他浏览器也类似)来分析网页,在Elments下找到需要的数据位置。

当我们点击了某个链接后,浏览器就会向服务器发出请求

3.1.2、编码规范

  • 通常Python程序第一行需要加入

    # -*- coding:utf-8 或者 # coding=utf-8
    

    这样可以在代码中包含中文,使其不乱码。

  • Python中使用#来添加注释,说明代码(段)的作用。

  • Python文件中加入main函数用于测试程序if __name__ == "__main__":,下面简单举例说明:

    """程序输出:hello 2hello 1__main__的意义:程序会依次调用 test(2) 和 test(1),因为python是解释型语言,会按顺序执行。为了使函数调用整齐有序,我们在__main__之前定义函数,在__main__中去调用。约定俗成我们都从main开始执行。
    """def main(a):print("hello", a)test(2)if __name__ == "__main__":main(1)
    

3.1.3、导入模块

这里要导入的第三方模块有:bs4、re、urllib、xlwt

Python导入第三方模块有两种方式,在命令行终端使用pip或者在PyCharm导入。

  • pip命令:在PyCharm底部选择Terminal,输入pip 第三方模块名来安装第三方模块。

  • PyCharm导入(常用):

    • 进入设置页面(Windows:Ctrl+Alt+S,Mac:command+,)

  • 输入要导入的模块进行安装(点击了左下角的install Package后就会自动安装了,安装完成或失败都有提示)

  • 添加xwltbs4(这里reurllibsqlite3是Python自带的,无需进行安装,直接导入)

    import re  # 正则表达式,用于文字匹配
    from bs4 import BeautifulSoup   # 用于网页解析,对HTML进行拆分,方便获取数据
    import urllib.request, urllib.error # 用于指定URL,给网址就能进行爬取
    import xlwt # 用于Excel操作
    import sqlite3  # 用于进行SQLite数据库操作
    

3.1.4、程序流程

这里先是大致思路,后面逐一对每个步骤进行实现。

# -*- coding = utf-8 -*-
# @Time : 2021/7/3 6:33 下午
# @Author : 张城阳
# @File : main.py
# @Software : PyCharmimport re  # 正则表达式,用于文字匹配
from bs4 import BeautifulSoup  # 用于网页解析,对HTML进行拆分,方便获取数据
import urllib.request, urllib.error  # 用于指定URL,给网址就能进行爬取
import xlwt  # 用于Excel操作
import sqlite3  # 用于进行SQLite数据库操作def main():# 豆瓣Top250网址(末尾的参数 ?start= 加不加都可以访问到第一页)baseUrl = "https://movie.douban.com/top250?start="# 1. 爬取网页并解析数据dataList = getData(baseUrl)# 2. 保存数据(以Excel形式保存)savePath = ".\\豆瓣电影Top250.xls"saveData(savePath)# 爬取网页,返回数据列表
def getData(baseurl):dataList = []# 爬取网页并获取需要的数据pass# 对数据逐一解析pass# 返回解析好的数据return dataList# 保存数据
def saveData(savePath):pass# 程序入口
if __name__ == "__main__":# 调用函数main()

3.2、获取数据

Python一般使用urllib库获取页面(Python2是urllib2,Python3将urllib和urllib2整合了),关于urllib可以我看另一篇博客Python 第三方库 —— urllib 学习。

  • 定义一个用于获取网页的函数askURL,给函数传入url就会返回该网址对于的网页内容。
  • 对于每一个页面都调用askURL去获取页面内容
  • 在访问页面时可能出现错误,为了保证程序正常运行,需要进行异常捕获try……except……
# 得到一个指定URL的网页内容
def askURL(url):# 模拟头部信息,像douban服务器发送消息# User-Agent 表明这是一个浏览器(这个来自谷歌浏览器F12里 Network中 Request headers的User-Agent)# 每个人的用户代理可能不相同,用自己的就好。不要复制错了,否则会报418状态码。head = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}# 封装头部信息request = urllib.request.Request(url, headers=head)html = ""try:# 发起请求并获取响应response = urllib.request.urlopen(request)# 读取整个HTML源码,并解码为UTF-8html = response.read().decode("utf-8")except urllib.error.URLError as e:# 异常捕获if hasattr(e, "code"):print("状态码:", e.code)if hasattr(e, "reason"):print("原因:", e.reason)return html# 爬取网页,返回数据列表
def getData(baseurl):dataList = []# 爬取所有网页并获取需要的HTML源码for i in range(0, 10):      # doubanTop250 共有10页,每页25条。 range(0,10)的范围是[0,10)。url = baseurl + str(i*25)  # 最终 url = https://movie.douban.com/top250?start=225html = askURL(url)      # 将每个页面HTML源码获取出来   # 对页面源码逐一解析pass# 返回解析好的数据return dataList

3.3、解析数据

现在开始解析获取到的HTML源码。根据观察发现,每一部电影信息都由<div class="item">包裹,其中包括电影名称、详情链接、图片链接等,这就需要用到正则表达式re库。关于re库,可以看我另一篇博客Python 库学习 —— Re 正则表达式。

下面是电影肖生克的救赎部分的HTML:

<div class="item"><div class="pic"><em class="">1</em><a href="https://movie.douban.com/subject/1292052/"><img width="100" alt="肖申克的救赎"src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class=""></a></div><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span><span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span></a><span class="playable">[可播放]</span></div><div class="bd"><p class="">导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情</p><div class="star"><span class="rating5-t"></span><span class="rating_num" property="v:average">9.7</span><span property="v:best" content="10.0"></span><span>2385802人评价</span></div><p class="quote"><span class="inq">希望让人自由。</span></p></div></div>
</div>

下面是解析数据部分代码:(为了方便观察,这里只对第一页进行了解析,把range(0, 1)改为range(0, 10)就是10页了。

# 正则表达式:.表示任意字符,*表示0次或任意次,?表示0次或1次。(.*?)惰性匹配。
findLink = re.compile(r'<a href="(.*?)">')  # 获取电影详情链接。
findImg = re.compile(r'<img.*src="(.*?)"', re.S)  # 获取影片图片。re.S 让换行符包含在字符串中
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 获取影片名称(可能有两个)
findOther = re.compile(r'<span class="other">(.*)</span>')  # 获取影片别称(多个别称以\分割)
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 获取影片评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 获取评价人数
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 获取影片概括
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 获取影片相关内容# 爬取网页,返回数据列表
def getData(baseurl):dataList = []# 爬取所有网页并获取需要的HTML源码for i in range(0, 1):  # 豆瓣Top250 共有10页,每页25条。 range(0,10)的范围是[0,10)。url = baseurl + str(i * 25)  # 最终 url = https://movie.douban.com/top250?start=225html = askURL(url)  # 将每个页面HTML源码获取出来# 对页面源码逐一解析soup = BeautifulSoup(html, "html.parser")  # 设置解析器for item in soup.find_all("div", class_="item"):  # 查找 class为item的div标签data = []  # 保存一部电影数据(每部电影由<div class="item">划分)item = str(item)  # 把item转为字符串类型(原本是Tag类型对象)# findall返回匹配成功的列表。link = re.findall(findLink, item)[0]  # 获取影片详情页链接,只需要一个就行。这里会返回两个。data.append(link)  # 把link追加到data里img = re.findall(findImg, item)[0]  # 获取影片图片链接data.append(img)titles = re.findall(findTitle, item)  # 获取影片名称# 有的影片title是两个,有的是一个。如果只有一个,则第二个保存空。if (len(titles) == 2):data.append(titles[0])titles[1] = re.sub("(/)|( )", "", titles[1])data.append("".join(titles[1].split()))else:data.append(titles[0])data.append("")other = re.findall(findOther, item)[0]  # 获取影片别称other = re.sub("(/)|( )", "", other)data.append("".join(other.split()))rating = re.findall(findRating, item)[0]  # 获取影片评分data.append(rating)judgeNum = re.findall(findJudge, item)[0]  # 获取影片评论人数data.append(judgeNum)inq = re.findall(findInq, item)  # 获取影片概述(可能不存在)if len(inq) != 0:inq = inq[0].replace("。", "")  # 去掉句号data.append(inq)else:data.append("")bd = re.findall(findBd, item)[0]  # 获取影片相关(删除不想要的符号)bd = re.sub('\\xa0', "  ", bd)  # 去除 HTML 空格符 &nbsp;bd = re.sub('(/\.\.\.)|(<br/>)|<br>', " ", bd)bd = re.sub("(    )|(\n)", "", bd)data.append(bd.strip())  # strip 去掉前后空格dataList.append(data)# 返回解析好的数据print(dataList)return dataList

3.4、保存数据

3.4.1、Excel表存储

利用Python库xlwt将获取到的数据dataList写入到Excel表(读取是xlrd模块)。可以看我另一篇博客Python 库学习 —— Excel存储(xlwt、xlrd)。

下面是将爬取到的电影保存至Excel中的代码:

# -*- coding = utf-8 -*-
# @Time : 2021/7/3 6:33 下午
# @Author : 张城阳
# @File : main.py
# @Software : PyCharmimport re  # 正则表达式,用于文字匹配
from bs4 import BeautifulSoup  # 用于网页解析,对HTML进行拆分,方便获取数据
import urllib.request, urllib.error, urllib.parse  # 用于指定URL,给网址就能进行爬取
import xlwt  # 用于Excel操作
import sqlite3  # 用于进行SQLite数据库操作
import ssl# 正则表达式:.表示任意字符,*表示0次或任意次,?表示0次或1次。(.*?)惰性匹配。
findLink = re.compile(r'<a href="(.*?)">')  # 获取电影详情链接。
findImg = re.compile(r'<img.*src="(.*?)"', re.S)  # 获取影片图片。re.S 让换行符包含在字符串中
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 获取影片名称(可能有两个)
findOther = re.compile(r'<span class="other">(.*)</span>')  # 获取影片别称(多个别称以\分割)
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 获取影片评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 获取评价人数
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 获取影片概括
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 获取影片相关内容def main():# 处理SSLssl._create_default_https_context = ssl._create_unverified_context# 豆瓣Top250网址(末尾的参数 ?start= 加不加都可以访问到第一页)baseUrl = "https://movie.douban.com/top250?start="# 1. 爬取网页并解析数据dataList = getData(baseUrl)# 2. 保存数据(以Excel形式保存)savePath = "豆瓣电影Top250.xlsx"saveData(dataList, savePath)# 得到一个指定URL的网页内容
def askURL(url):# 模拟头部信息,像豆瓣服务器发送消息# User-Agent 表明这是一个浏览器(这个来自F12里Network中 Request headers的User-Agent)head = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}# 封装头部信息request = urllib.request.Request(url, headers=head)html = ""try:# 发起请求并获取响应response = urllib.request.urlopen(request)# 读取整个HTML源码,并解码为UTF-8html = response.read().decode("utf-8")except urllib.error.URLError as e:# 异常捕获if hasattr(e, "code"):print("状态码:", e.code)if hasattr(e, "reason"):print("原因:", e.reason)return html# 爬取网页,返回数据列表
def getData(baseurl):dataList = []# 爬取所有网页并获取需要的HTML源码for i in range(0, 10):  # 豆瓣Top250 共有10页,每页25条。 range(0,10)的范围是[0,10)。url = baseurl + str(i * 25)  # 最终 url = https://movie.douban.com/top250?start=225html = askURL(url)  # 将每个页面HTML源码获取出来# 对页面源码逐一解析soup = BeautifulSoup(html, "html.parser")  # 设置解析器for item in soup.find_all("div", class_="item"):  # 查找 class为item的div标签data = []  # 保存一部电影数据(每部电影由<div class="item">划分)item = str(item)  # 把item转为字符串类型(原本是Tag类型对象)# findall返回匹配成功的列表。link = re.findall(findLink, item)[0]  # 获取影片详情页链接,只需要一个就行。这里会返回两个。data.append(link)  # 把link追加到data里img = re.findall(findImg, item)[0]  # 获取影片图片链接data.append(img)titles = re.findall(findTitle, item)  # 获取影片名称# 有的影片title是两个,有的是一个。如果只有一个,则第二个保存空。if (len(titles) == 2):data.append(titles[0])  # 中文名称titles[1] = re.sub("(/)|( )", "", titles[1])data.append("".join(titles[1].split()))  # 英文名称else:data.append(titles[0])  # 中文名称data.append("")  # 没有英文名称,添加空other = re.findall(findOther, item)[0]  # 获取影片别称other = other.replace("/", "", 1)other = re.sub("(&nbsp;)|(NBSP)|(\\xa0)|( )", "", other) # 去除空格data.append(other)rating = re.findall(findRating, item)[0]  # 获取影片评分data.append(rating)judgeNum = re.findall(findJudge, item)[0]  # 获取影片评论人数data.append(judgeNum)inq = re.findall(findInq, item)  # 获取影片概述(可能不存在)if len(inq) != 0:inq = inq[0].replace("。", "")  # 去掉句号data.append(inq)else:data.append("")bd = re.findall(findBd, item)[0]  # 获取影片相关(删除不想要的符号)bd = re.sub('\\xa0', "  ", bd)  # 去除 HTML 空格符 &nbsp;bd = re.sub('(/\.\.\.)|(<br/>)|<br>', " ", bd)bd = re.sub("(    )|(\n)", "", bd)data.append(bd.strip())  # strip 去掉前后空格dataList.append(data)# 返回解析好的数据return dataList# 保存数据
def saveData(dataList, savePath):print("正在保存...")book = xlwt.Workbook(encoding="utf-8")sheet = book.add_sheet("豆瓣电影Top250", cell_overwrite_ok=True)  # 第二个参数表示 可以对单元格进行覆盖# 写入列名(第一行存储列名)col = ("影片详情链接", "图片链接", "影片中文名", "影片外国名", "影片别称", "评分", "评论人数", "影片概括", "影片相关信息")for i in range(0, len(col)):sheet.write(0, i, col[i])# 写入电影信息(从第二行开始)for i in range(0, 250):print("正在保存->第%d部电影" % (i + 1))data = dataList[i]  # 取出某部电影数据for j in range(0, len(col)):sheet.write(i + 1, j, data[j])book.save(savePath)  # 保存Excelprint("保存完成!!")# 程序入口
if __name__ == "__main__":# 调用函数main()

运行效果:

3.4.1、SQLite数据库保存

使用这种方式至少得对数据库要有所了解,要明白SQL语句的基本使用。

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。简单来说,SQLite 是把存储内容作为一个文件保存在本地的,它和MySQL不一样,MySQL是保存数据到服务器里。(Android中也常常用到SQLite)

下面用Python简单描述下如何使用SQLite:

import sqlite3
# 一. 使用流程
# 1.打开或创建数据库文件
connect = sqlite3.connect("test.db")
# 2.获取游标
c = connect.cursor()
# 3.执行SQL语句
sql = "...."
c.execute(sql)
# 4.提交(插入、删除、更新、创建表需要提交,查询不需要提交)
connect.commit()
# 5.关闭
connect.close()# 插入、删除、更新比较简单,执行SQL语句就行。
# 查询语句 会返回一个结果集,用列表进行查看就行。下面演示下查询。# 创建 user 表
connect = sqlite3.connect("test.db")
c = connect.cursor()
sql1 = "create table `user`(id int primary key not null, name varchar(10) not null)"
c.execute(sql1)
connect.commit()# 插入两条数据并立马查询
connect = sqlite3.connect("test.db")
c = connect.cursor()
sql2 = "insert into user(id, name) values(1, '小白'), (2, '小红');"
c.execute(sql2)
connect.commit()sql3 = "select * from user"
cursor = c.execute(sql3)
for row in cursor:print("id = ", row[0], "name = ", row[1])
connect.commit()connect.close()

下面是完整的SQLite代码:

# -*- coding = utf-8 -*-
# @Time : 2021/7/3 6:33 下午
# @Author : 张城阳
# @File : main.py
# @Software : PyCharmimport re  # 正则表达式,用于文字匹配
from bs4 import BeautifulSoup  # 用于网页解析,对HTML进行拆分,方便获取数据
import urllib.request, urllib.error, urllib.parse  # 用于指定URL,给网址就能进行爬取
import xlwt  # 用于Excel操作
import sqlite3  # 用于进行SQLite数据库操作
import ssl# 正则表达式:.表示任意字符,*表示0次或任意次,?表示0次或1次。(.*?)惰性匹配。
findLink = re.compile(r'<a href="(.*?)">')  # 获取电影详情链接。
findImg = re.compile(r'<img.*src="(.*?)"', re.S)  # 获取影片图片。re.S 让换行符包含在字符串中
findTitle = re.compile(r'<span class="title">(.*)</span>')  # 获取影片名称(可能有两个)
findOther = re.compile(r'<span class="other">(.*)</span>')  # 获取影片别称(多个别称以\分割)
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  # 获取影片评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')  # 获取评价人数
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 获取影片概括
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 获取影片相关内容def main():# 处理SSLssl._create_default_https_context = ssl._create_unverified_context# 豆瓣Top250网址(末尾的参数 ?start= 加不加都可以访问到第一页)baseUrl = "https://movie.douban.com/top250?start="# 1. 爬取网页并解析数据dataList = getData(baseUrl)# 2. 保存数据dbPath = "movie.db"saveDataToDB(dataList, dbPath)  # SQLite# 得到一个指定URL的网页内容
def askURL(url):# 模拟头部信息,像豆瓣服务器发送消息# User-Agent 表明这是一个浏览器(这个来自F12里Network中 Request headers的User-Agent)head = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}# 封装头部信息request = urllib.request.Request(url, headers=head)html = ""try:# 发起请求并获取响应response = urllib.request.urlopen(request)# 读取整个HTML源码,并解码为UTF-8html = response.read().decode("utf-8")except urllib.error.URLError as e:# 异常捕获if hasattr(e, "code"):print("状态码:", e.code)if hasattr(e, "reason"):print("原因:", e.reason)return html# 爬取网页,返回数据列表
def getData(baseurl):dataList = []# 爬取所有网页并获取需要的HTML源码for i in range(0, 10):  # 豆瓣Top250 共有10页,每页25条。 range(0,10)的范围是[0,10)。url = baseurl + str(i * 25)  # 最终 url = https://movie.douban.com/top250?start=225html = askURL(url)  # 将每个页面HTML源码获取出来# 对页面源码逐一解析soup = BeautifulSoup(html, "html.parser")  # 设置解析器for item in soup.find_all("div", class_="item"):  # 查找 class为item的div标签data = []  # 保存一部电影数据(每部电影由<div class="item">划分)item = str(item)  # 把item转为字符串类型(原本是Tag类型对象)# findall返回匹配成功的列表。link = re.findall(findLink, item)[0]  # 获取影片详情页链接,只需要一个就行。这里会返回两个。data.append(link)  # 把link追加到data里img = re.findall(findImg, item)[0]  # 获取影片图片链接data.append(img)titles = re.findall(findTitle, item)  # 获取影片名称# 有的影片title是两个,有的是一个。如果只有一个,则第二个保存空。if (len(titles) == 2):data.append(titles[0])  # 中文名称titles[1] = re.sub("(/)|( )", " ", titles[1])data.append("".join(titles[1].split()))  # 英文名称else:data.append(titles[0])  # 中文名称data.append("")  # 没有英文名称,添加空other = re.findall(findOther, item)[0]  # 获取影片别称other = other.replace("/", "", 1)other = re.sub("(&nbsp;)|(NBSP)|(\\xa0)|( )", "", other)data.append(other)rating = re.findall(findRating, item)[0]  # 获取影片评分data.append(rating)judgeNum = re.findall(findJudge, item)[0]  # 获取影片评论人数data.append(judgeNum)inq = re.findall(findInq, item)  # 获取影片概述(可能不存在)if len(inq) != 0:inq = inq[0].replace("。", "")  # 去掉句号data.append(inq)else:data.append("")bd = re.findall(findBd, item)[0]  # 获取影片相关(删除不想要的符号)bd = re.sub('\\xa0', "  ", bd)  # 去除 HTML 空格符 &nbsp;bd = re.sub('(/\.\.\.)|(<br/>)|<br>', " ", bd)bd = re.sub("(    )|(\n)", "", bd)data.append(bd.strip())  # strip 去掉前后空格dataList.append(data)# 返回解析好的数据return dataList# 初始化数据库
def iniDB(dbPath):print("正在初始化...")# 创建表sql = '''create table if not exists movie250(id integer primary key autoincrement,info_link text,pic_link text,c_name varchar,e_name varchar,other_name varchar,score numeric,rated numeric,introduction text,info text);'''connect = sqlite3.connect(dbPath)cursor = connect.cursor()cursor.execute(sql)connect.commit()cursor.close()connect.close()print("初始化完成!!")# 保存数据(SQLite)
def saveDataToDB(dataList, dbPath):iniDB(dbPath)  # 初始化数据库connect = sqlite3.connect(dbPath)cursor = connect.cursor()print("正在入库...")# dataList存储了250部电影的信息,data一部电影的信息列表,它包含了9个元素。for data in dataList:# 这个for循环是为了将列表字符串元素都加上双引号,因为后面拼接sql时 每个元素需要双引号括起来。for index in range(len(data)):# 下标6和7的元素是score和rated,是数字类型,不需要引号。if index == 5 or index == 6:continuedata[index] = '"' + data[index] + '"'# 下面是用 %s 作为占位符,填充的是 ",".join(data)。# ",".join(data)表明 把列表data转为字符串且每个元素用逗号隔开。sql = '''insert into movie250(info_link, pic_link, c_name, e_name, other_name, score, rated, introduction, info)values(%s)''' % ",".join(data)cursor.execute(sql)connect.commit()cursor.close()connect.close()print("入库完毕!!")# 程序入口
if __name__ == "__main__":main()

运行结果这里在PyCharm中查看:

Python 学习 02 —— Python如何爬取数据相关推荐

  1. 菜鸟Python实战-03爬虫之爬取数据

    最近想学习一下爬虫 所以参考了一下网上的代码,并加以理解和整理,好记性不如烂笔头吧. 以下代码的目标网站是豆瓣电影:https://movie.douban.com/top250?start=%22( ...

  2. python爬虫实战之异步爬取数据

    python爬虫实战之异步爬取数据 文章目录 前言 一.需求 二.使用步骤 1.思路 2.引入库 3.代码如下 总结 前言 python中异步编程的主要三种方法:回调函数.生成器函数.线程大法. 以进 ...

  3. Python实训day07am【爬取数据接口、webdriver、自动化测试工具selenium】

    Python实训-15天-博客汇总表 目录 1.网络爬虫-课后练习题 1.1.写法1 1.2.写法2 2.Selenium自动化测试工具 2.1.安装工具 2.2.命令行操作 直接爬取HTML (30 ...

  4. Python 理解使用requests库爬取数据

    requests库是爬取数据的第三方库,安装方法: pip3 install requests 用法: r = requests.get(url) r 是返回的response对象,有五个最常用的属性 ...

  5. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  6. python selenium不启动浏览器 爬取数据的方法

    为浏览器驱动 添加一个无头参数.可以实现不开启浏览器 爬取网页 最新版的selenium已经不再支持PhantomJS 源码如下: # -*- coding:utf-8 -*-from seleniu ...

  7. python有道api-Python3--批量爬取数据之调用有道api进行翻译

    上代码:# coding=utf-8 import urllib,urllib.request from fake_useragent import UserAgent import json imp ...

  8. Python学习笔记16:爬取百度搜索图片的缩略图

    找图,通过百度之类的搜索引擎最方便. 如何爬取百度搜索的图片,也是一个有意思的话题. 进入百度图片,随便输入搜索内容,比如"美女". 打开 F12 ,查看 network ,选择 ...

  9. python学习(五)爬取今日头条图库

    今天抽出时间写了一个小爬虫 来爬取今日头条的图片 简要的说下 1图片首页是通过ajax 发生请求 得到json数据 然后渲染到网页, 2然后每个详情页中 在获取的网页的源代码中 是包含图片地址的 但是 ...

最新文章

  1. Oracle 定时器
  2. 使用 RequireJS 优化 Web 应用前端
  3. 超全荧光定量PCR应用常见问题
  4. 微软开源Reactive Extensions
  5. 前序-中序-后序-非递归-实现
  6. Nginx代理webSocket经常中断的解决方案, 如何保持长连接
  7. P4158-[SCOI2009]粉刷匠【dp,背包】
  8. *如何循序渐进向DotNet架构师发展(转)
  9. 普通人有必要也学个人品牌吗?
  10. 有的网线接口为什么做不到轻薄化?
  11. 25.使用getScript()方法异步加载并执行js文件
  12. 计算理论笔记 10月10日
  13. 网易云音乐(电脑版)网络连接不上,救命啊!!!
  14. 前端实现PDF文件下载的两种方式
  15. php使用iframe框架,ThinkPHP后台首页使用iframe(框架)
  16. 计算机中升序符号,电脑excel表格软件中的标点符号怎么快速替换
  17. dell笔记本外接显示器_戴尔笔记本怎么连接外接显示器?
  18. 安卓游戏优化加速器v1.0.5
  19. python开发指法练习软件_猿编程电脑端
  20. 关于java学习的一些东西

热门文章

  1. android Error receiving broadcast
  2. tinyurl_如何查看TinyUrl真正链接到的位置
  3. Swift5.2 Control IOSMap(苹果地图)
  4. STM32工程查看函数定义出现提示source broswer:xxxxxxxxxxxis undefine
  5. JS计算两个经纬度坐标与正北方向夹角
  6. 输入框input三方禁止输入方法及bug——做禁止字符输入限制时,使用拼音未确定时英文字母上屏
  7. 关于安全支付的几个tips
  8. editText限制字数并提示
  9. 域名解析--什么是A记录、别名记录(CNAME)、MX记录、TXT记录、NS记录
  10. web前端全栈0基础到精通(祺)09