python3+requests+BeautifulSoup+mysql爬取豆瓣电影top250
基础页面:https://movie.douban.com/top250
代码:
from time import sleep
from requests import get
from bs4 import BeautifulSoup
import re
import pymysqldb = pymysql.connect(host='localhost',user='root',password='123456',db='douban',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)
try:with db.cursor() as cursor:sql = "CREATE TABLE IF NOT EXISTS `top250` (" \"`id` int(6) NOT NULL AUTO_INCREMENT," \"`top` int(6) NOT NULL," \"`page-code` int(6) NOT NULL," \"`title` varchar(255) NOT NULL," \"`origin-title` varchar(255)," \"`score` float NOT NULL," \"`theme` varchar(255) NOT NULL," \"PRIMARY KEY(`id`)" \") ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"cursor.execute(sql,)
finally:db.commit()base_url = 'https://movie.douban.com/top250'
header = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Cookie': 'xxx','Host': 'movie.douban.com','Referer': 'https://movie.douban.com/chart','Upgrade-Insecure-Requests': '1','User-Agent': 'xxx'
}def crawler(url=None, headers=None, delay=1):r = get(url=url, headers=headers, timeout=3)soup = BeautifulSoup(r.text, 'html.parser')page_tag = soup.find('span', attrs={'class': 'thispage'})page_code = re.compile(r'<span class="thispage">(.*)</').findall(str(page_tag))[0]movie_ranks = soup.find_all('em', attrs={'class': ''})movie_titles = soup.find_all('div', attrs={'class': 'hd'})movie_scores = soup.find_all('span', attrs={'class': 'rating_num'})movie_themes = soup.find_all('span', attrs={'class': 'inq'})next_page = soup.find('link', attrs={'rel': 'next'})for ranks, titles, scores, themes in zip(movie_ranks, movie_titles, movie_scores, movie_themes):rank = re.compile(r'<em class="">(.*)</').findall(str(ranks))regex_ts = re.compile(r'<span class="title">(.*)</').findall(str(titles))title = regex_ts[0]score = re.compile(r'<span class="rating_num" property="v:average">(.*)</').findall(str(scores))[0]theme = re.compile(r'<span class="inq">(.*)</').findall(str(themes))[0]try:origin_title = regex_ts[1]origin_title = re.compile(r'./.(.+)').findall(origin_title)[0]with db.cursor() as cursor:sql = "INSERT INTO `top250` (`top`, `page-code`, `title`, `origin-title`, `score`, `theme`)" \" VALUES (%s, %s, %s, %s, %s, %s)"cursor.execute(sql, (rank, page_code, title, origin_title, score, theme,))except IndexError:with db.cursor() as cursor:sql = "INSERT INTO `top250` (`top`, `page-code`, `title`, `score`, `theme`)" \" VALUES (%s, %s, %s, %s, %s)"cursor.execute(sql, (rank, page_code, title, score, theme,))finally:db.commit()if next_page is not None:headers['Referer'] = urlnext_url = base_url + re.compile(r'<link href="(.*)" rel="next">').findall(str(next_page))[0]sleep(delay)crawler(url=next_url, headers=headers, delay=3)crawler(base_url, header, 0)
db.close()
结果:
mysql> select top,title,score from top250 where id = 175; +-----+--------+-------+ | top | title | score | +-----+--------+-------+ | 176 | 罗生门 | 8.7 | +-----+--------+-------+ 1 row in set (0.00 sec)mysql> select top,title,page-code,score from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'page' in 'field list' mysql> select top,page-code,title,score from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'page' in 'field list' mysql> select page-code from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'page' in 'field list' mysql> describe top250-> ; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(6) | NO | PRI | NULL | auto_increment | | top | int(6) | NO | | NULL | | | page-code | int(6) | NO | | NULL | | | title | varchar(255) | NO | | NULL | | | origin-title | varchar(255) | YES | | NULL | | | score | float | NO | | NULL | | | theme | varchar(255) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 7 rows in set (0.32 sec)mysql> select page-code from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'page' in 'field list' mysql> select origin-title from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'origin' in 'field list' mysql> select origin_title from top250 where id = 175; ERROR 1054 (42S22): Unknown column 'origin_title' in 'field list' mysql> select * from top250 where id = 175; +-----+-----+-----------+--------+--------------+-------+-------------------+ | id | top | page-code | title | origin-title | score | theme | +-----+-----+-----------+--------+--------------+-------+-------------------+ | 175 | 176 | 8 | 罗生门 | 羅生門 | 8.7 | 人生的N种可能性。 | +-----+-----+-----------+--------+--------------+-------+-------------------+ 1 row in set (0.00 sec)mysql> select * from top250 where title = 未麻的部屋; ERROR 1054 (42S22): Unknown column '未麻的部屋' in 'where clause' mysql> select * from top250 where top=175; Empty set (0.00 sec)mysql>
两个小问题:
1.没想到数据库字段不能用'-'...,于是page-code字段与origin-title字段不能独立进行查找。。。
2.不知道为啥top175的电影《未麻的部屋》没爬到。。。
建议使用scrapy。
用scrapy的一些好处是配置爬虫很方便,还有其内部自带的html解析器、对不完整的url的组建等十分便利。
最后,吐槽一下,之前的电脑配置太差,跑深度学习程序的过程耗尽内存,出现莫名的bug后,蓝屏死机就再也没法启动了。。。所以,暂时不能更新博客了。。。
转载于:https://www.cnblogs.com/darkchii/p/10003876.html
python3+requests+BeautifulSoup+mysql爬取豆瓣电影top250相关推荐
- Python爬虫实战 | (3) 爬取豆瓣电影Top250
在本篇博客中,我们将使用requests+正则表达式来爬取豆瓣电影TOP250电影榜单,获取每部电影的序号.片名.导演.编剧.主演.类型.制作国家/地区.语言.上映日期.片长.又名.豆瓣评分和剧情简介 ...
- 使用python3爬取豆瓣电影top250
经过一个多星期的学习,对python3的语法有了一定了解,马上动手做了一个爬虫,检验学习效果 目标 爬取豆瓣电影top250中每一部电影的名称.排名.链接.名言.评分 准备工作 运行平台:window ...
- python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格
豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...
- day02 requests请求库爬取豆瓣电影信息+selenium请求库
一. requests请求库爬取豆瓣电影信息 - 请求url http://movie.douban.com/top250 - 请求方式 GET - 请求头 user-agent cookies ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
一起学爬虫--通过爬取豆瓣电影top250学习requests库的使用 学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python req ...
- python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250
今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...
- Python爬虫 爬取豆瓣电影TOP250
Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...
- 爬虫练习-爬取豆瓣电影TOP250的数据
前言: 爬取豆瓣电影TOP250的数据,并将爬取的数据存储于Mysql数据库中 本文为整理代码,梳理思路,验证代码有效性--2020.1.4 环境: Python3(Anaconda3) PyChar ...
- 爬取豆瓣电影Top250影片信息
爬取豆瓣电影Top250影片信息 查看影片的详细信息 爬取过程 需安装的包 确定爬取地址 发送请求头 解析数据 保存数据 完整代码 查看影片的详细信息 进入豆瓣电影Top250,选择某一影片,右击,选 ...
最新文章
- easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案
- 24小时临时邮箱_免费临时邮箱和接码平台
- 启动hive报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang
- 怎样将两个html页面合并,如何把WORD的两个页面合并在一起?
- Kubenetes里pod和service绑定的实现方式
- php单文件压缩的功能函数的实现
- jquery的懒加载记录一下踩得坑
- 仰望星空后,更将脚踏实地!
- 鸿蒙手机系统还没有开发,华为鸿蒙手机太难了!引发开发者大吐槽:为何没有自己独特风格?-互联网/电商-文章-小虾米...
- 积微论坛第一期 - 基于大数据整合预测土壤枯萎病的发生 (文稿分享)
- 【环境搭建003】UBUNTU + ECLIPS + ANDROID 嵌入式系统编译环境搭建遇到的稀奇古怪的问题集合
- Fragment的使用
- SAP WM + PDA项目 来料入库流程
- 英特尔的新方向:称王集成计算设备领域
- 【Uly】团队&团队博客成立典礼~~
- 犹太民族与基督的真相!
- 360,一场阴谋的制造者
- 【30-60s计数器电路设计】数电课设
- 2022-03-05 使用 putty 远程连接阿里云服务器
- 寒冬已过,2023抓住IT复苏新机会
热门文章
- MathType中如何实现上下两行公式“=”号对齐
- 使用ZED相机录制事件双目数据集
- @loj - 2478@「九省联考 2018」林克卡特树
- C++入门到精通。(五、C++的运算符。)
- php识别word语言,PHP读取word文档
- 朴素贝叶斯的概念简介
- 王道操作系统网课笔记合集
- NBA球员 ESPN前20排名:詹姆斯再居榜首
- 【游戏】任天堂Nintendo Switch超详细购买/使用指南以及注意事项(根据自己使用持续更新中...)
- 微信小程序引用vant toast 提示 “未找到 van-toast 节点“