项目源码

import requests   # 发起请求的库
from fake_useragent import UserAgent   # 构造user-Agent的库
import mysql.connector   # Python和MySQL连接的库
from typing import NoReturn, Tuple   # 类型标注的库
from lxml import etree   # 使用lxml提取html的库
import re   # Python中的正则表达式库
import csv  # 写入csv文件的库
import time  # 程序休眠库class bouban_Top250:def __init__(self):"""初始化"""self.conn = mysql.connector.connect(  # 构造和mysql的连接host='localhost',user='root',passwd='123456',port=3307,charset='utf8',database='reptile')self.my_cursor = self.conn.cursor()  # 创建油标self.start_id = 1    # 电影id编号self.all_movies_list = []   # 用来存储所有电影信息def send_request(self, url: str) -> str:"""发送get请求,将HTML页面源码返回url:str类型,要请求的链接return:str类型,请求的链接页面的html源码"""# 使用fake_useragent.UserAgent()构造请求头headers = {'user-Agent': UserAgent().Chrome,}# 发起请求response = requests.get(url=url, headers=headers)# 根据状态码来返回HTML页面源码if response.status_code == 200:return response.textelse:print('status_code error')return '-1'def parse_html(self, html: str) -> Tuple[Tuple]:"""解析html源码html:str类型,html页面源码return:Tuple[Tuple],元组中的每一个元素也是一个元组,每一个元素对应一个电影的所有信息"""# 初始化lxmle = etree.HTML(html, etree.HTMLParser())# 获取li标签列表,每一个li标签中包含一个电影的所有信息li_list = e.xpath('//ol[@class="grid_view"]/li')movies_tuple = []# 遍历每一个li标签,对每一个li标签进行解析for li in li_list:try:name = ''.join(li.xpath('./div/div[@class="info"]/div[@class="hd"]/a/span[@class="title"][1]/text()'))href = ''.join(li.xpath('./div/div[@class="info"]/div[@class="hd"]/a/@href'))performers = ''.join(li.xpath('string(./div/div[@class="info"]/div[@class="bd"]/p[1])'))pattern = re.compile('\n+|\s+')performers = re.sub(pattern=pattern, repl='', string=performers)score = float(''.join(li.xpath('./div/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')))quote = ''.join(li.xpath('./div/div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()'))tem = (self.start_id, name, href, performers, score, quote)movies_tuple.append(tem)print(self.start_id, name, href, performers, score, quote, sep="  ")self.start_id += 1except:continuereturn tuple(movies_tuple)def create_table(self, table_name: str) -> NoReturn:"""在mysql数据库中创建表table_name:str类型,要创建表的表名"""sql_create_table = "create table if not exists {}(\ID int ,\mv_name varchar(50),\href varchar(50),\performers varchar(300),\score decimal(3, 1),\quote varchar(50), \primary key (ID)\) ENGINE=INNODB DEFAULT CHARSET='utf8mb4' COLLATE='utf8mb4_unicode_ci'".format(table_name)self.my_cursor.execute(sql_create_table)def insert_to_mysql(self, table_name: str, movies_tuple: Tuple[Tuple]) -> NoReturn:"""将传入的电影元组中的所有电影插入到表中table_name:str类型,要插入信息的表的表名movies_tuple:Tuple[Tuple]类型,每一个元素也是元组,其中包含一个电影的所有信息"""sql_insert = "insert into {} values (%s, %s, %s, %s, %s, %s)".format(table_name)self.my_cursor.executemany(sql_insert, movies_tuple)self.conn.commit()def append_to_MV_list(self, movies_tuple: Tuple[Tuple]) -> NoReturn:"""将电影元组中的所有电影添加到所有电影列表movies_tuple:Tuple[Tuple]类型,要加入的电影元组"""for movie in movies_tuple:self.all_movies_list.append(movie)def writer_into_csv(self, file_name: str, movies_tuple: Tuple[Tuple]) -> NoReturn:"""将传入的电影元组中的电影写入csv文件file_name:str类型,要创建的csv文件的文件名movies_tuple:Tuple[Tuple]类型,要写入的电影元组"""headers = ['编号', '电影名称', '电影链接', '演员信息', '豆瓣评分', '引述']with open(file_name, 'w', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(headers)writer.writerows(movies_tuple)def writer_into_txt(self, file_name: str, movies_tuple: Tuple[Tuple]) -> NoReturn:"""将传入的电影元组写入到txt文件中file_name:str类型,要创建的txt文件名movies_tuple:Tuple[Tuple]类型,要写入的电影元组"""headers = ['编号', '电影名称', '电影链接', '演员信息', '豆瓣评分', '引述']headers = '  '.join(headers)with open(file_name, 'w', encoding='utf-8') as f:f.write(headers+'\n')for movie in movies_tuple:movie = list(movie)movie[0] = str(movie[0])movie[4] = str(movie[4])movie = str('  '.join(movie))f.write(movie+'\n')def get_next_page_url(self, html: str) -> str:"""从html源码中获取下一页的链接html:str类型,获取下一页的html源码return:str类型,构造出来的下一页的url"""e = etree.HTML(html, etree.HTMLParser())url = ''.join(e.xpath('//span[@class="next"]/a/@href'))if url:next_page_url = 'https://movie.douban.com/top250{}'.format(url)return next_page_urlelse:return ''if __name__ == '__main__':"""程序入口"""bouban = bouban_Top250()url = 'https://movie.douban.com/top250?start=0&filter='bouban.create_table('douban')while url:html = bouban.send_request(url)url = bouban.get_next_page_url(html)movies_tuple = bouban.parse_html(html)bouban.append_to_MV_list(movies_tuple)time.sleep(1)all_movies_tuple = tuple(bouban.all_movies_list)bouban.insert_to_mysql('douban', all_movies_tuple)bouban.writer_into_txt('douban.txt', all_movies_tuple)bouban.writer_into_csv('douban.csv', all_movies_tuple)

准备工作

  • 安装好程序中用到的第三方库
  • 安装好mysql,并将mysql的服务打开
  • 在__init__方法初始化中,将mysql的用户名和密码、数据库更改为自己的,特别是端口号,因为我的电脑中有两个不同的mysql版本,所以我用的端口号是3307
  • 确保自己的电脑有网
  • 认真看代码,注释中都写了代码的功能,有一些代码看不懂要去查一查
  • 我写本文的日期是2021.03 ,豆瓣更新反爬虫可能会导致爬取无效!

结果展示



心得

  • re.sub()方法真是坑,它会将替换后的文本返回,不会直接对原来的文本做更改,弄得我花了几十分钟
  • 将文本写入txt文件中不会自动换行,还要自己加换行符,害得我又删除->更改->删除…
  • 将文本写入txt文件中不指定编码方式会导致乱码,我去
  • 你看看下面的结果:
a1 = ((1, 2), (3, 4))
a2 = (('a', 'b'))
a3 = [1, 2]
a4 = [(1, 2)]a1 + a4 = ?
a4.append(a1)  = ?
a3 + a4 = ?
我又新建了好几个文件来实验,好烦
  • 从编写到完成,我的mysql中的表已经删除了不少于20次

爬取豆瓣TOP250并将数据保存为txt文件和csv文件并存入MySQL数据库相关推荐

  1. 爬取豆瓣TOP250

    第一课<爬取豆瓣TOP250> 1.准备工作 2.开始爬取网页 (1)分析网页 (2)用for循环表示这个分析结果 (3)用page函数表示这10页的url链接 3.正式爬取网页 (1)请 ...

  2. Python爬取豆瓣Top250电影可见资料并保存为excel形式

    Python爬取豆瓣Top250电影可见资料并保存为excel形式 利用requests第三方库实现网页的元素爬取,再使用openpyxl库进行信息的录入. 具体思路 1.分析网页的headers. ...

  3. 爬取豆瓣Top250数据并且可视化

    爬取豆瓣Top250数据并且数据可视化 话不多说,直接上代码 爬虫代码展示 -*- codeing = utf-8 -*- from bs4 import BeautifulSoup # 网页解析,获 ...

  4. scrapy爬取豆瓣top250电影数据

    scrapy爬取豆瓣top250电影数据 scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. sc ...

  5. Python 爬取周杰伦歌曲信息,爬取豆瓣top250的电影,并保存至excel中

    使用requests.BeautifulSoup模块,在网上爬取信息.有的网页可以直接爬取到,有些则需要分步加载,这时就需要使用network进行分析找到信息对应的请求. 有的会反爬虫,则需要添加he ...

  6. python豆瓣历史评分_Python实战-爬取豆瓣top250评分高于指定值的电影信息

    思路 1. 要获得怎么样的数据 2. 找到数据来源 3. 模拟浏览器发送请求获得数据 4. 处理数据,保存数据 第一步: 在这里数据是豆瓣top250中高于指定分数的电影信息 信息有:名称,评分,格言 ...

  7. python 爬取豆瓣某一主题书单_Python爬虫 || 使用requests和xpath爬取豆瓣Top250书单内容全解。...

    昨天,我们了解了如何爬取豆瓣某一个电影固定的位置信息,包含电影名称.导演.演员及评分等,今天我们来了解一下如何爬取豆瓣Top250书单,并如何将爬取到的内容存放到本地. 废话不多说了,shou my ...

  8. task1 - 爬取豆瓣Top250电影名

    豆瓣Top250电影名怎么爬 参考博文:https://www.cnblogs.com/leon507/p/7614345.html 怎么实现 因为没有系统学习过,所以只能做搬运工.看了几篇有关爬取豆 ...

  9. 【爬虫】案例(爬取豆瓣top250)[完整+详细]

    文章目录 1.需求 2.流程 3.实现 导包 主函数 数据获取 数据解析 存储到excel 简易数据库 存储到数据库 5.完整代码 6.小注 1.需求 爬取豆瓣top250的电影的播放链接,封面链接, ...

最新文章

  1. mysql windows 管道连接,科技常识:Windows Server 2016 MySQL数据库安装配置详细安装教程...
  2. 完美,竟然用一个脚本就把系统升级到https了,且永久免费!
  3. 实现ip数据包抓取并分析_一些网站https证书出现问题的情况分析
  4. mysql可重复读和间隙锁_解决MySQL可重复读——详解间隙锁
  5. git上传项目 openssh_GitHub上传项目
  6. sql分别对两列数据求和以不同的条件_利用数组与字典,实现双条件数据汇总的方法...
  7. Window平台编译log4cpp使用方法记录 (二)
  8. idcsystem源码php_最新PHP宝塔IDC分销系统源码
  9. 【软件开发架构平台】CH2 Spring IoC和Bean管理
  10. ESD试验与设备介绍
  11. MyEclipse 下载、安装教程
  12. InsecureProgramming-master——abo4
  13. 移动端(一)—— 移动端概念
  14. Vim常用操作,normal模式、insert模式和visual模式
  15. 数据库——《对数据进行排序》
  16. linux系统ubuntu
  17. ubuntu 16.04下安装pytorch配置caffe2(cuda 9.0+cudnn 7.6)
  18. 为了在nano上进行远程连接
  19. PHP活动现场大屏幕互动系统源码 带微信上墙+3D签到投票抽奖+互动游戏+红包等功能
  20. 世间只此一人,疯狂改变世界

热门文章

  1. 深度解密Go语言之基于信号的抢占式调度
  2. 华为云网络覆盖全球2500+站点,打造高品质、低成本接入体验
  3. 复杂网络下多码率视频流切换关键技术
  4. Go语言中*和的区别
  5. Hive安装及常用交互命令
  6. Tencent JDK 国产化CPU架构支持分享
  7. linux centos 编译Lua5.2.0 静态库 动态库
  8. 最简单的设置按钮的鼠标悬停效果
  9. 更改idea控制台输出字体
  10. 每日两SQL(2),欢迎交流~