上一篇通过requests+正则爬取了猫眼电影榜单,这次通过requests+beautifulsoup再爬取一次(其实这个网站更适合使用beautifulsoup库爬取)

1.先分析网页源码

可以看出每部电影信息都包含在一堆<dd>...</dd>标签中,所以第一步可以通过beautifulsoup库解析出所有<dd>标签对,然后再从<dd>标签对中依次解析排名所在的<i>标签,电影名所在的<p>标签,上映时间所在的<p>标签以及分数所在的<p>标签。

2.信息提取代码

# coding: utf-8
# author: hmk from bs4 import BeautifulSoup
import requests
import bs4 url = 'http://maoyan.com/board/4'
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "maoyan.com",
"Referer": "http://maoyan.com/board",
"Upgrade-Insecure-Requests": "",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36"}
r = requests.get(url, headers=header)
r.encoding = r.apparent_encoding
html = r.text
soup = BeautifulSoup(html, 'html.parser')
# print(soup.find_all('dd'))
list=[] # 定义一个列表,保存所有电影数据,一定不要定义在循环里面,不然每次都会清空,最后只会留下最后一部电影的数据
for dd in soup.find_all('dd'):
index = dd.i.string # 电影排名
# print(index)
movie = dd.find('p', class_='name').string # 电影名称
# print(movie.string)
release_times = dd.find('p', class_='releasetime') # 上映时间
release_time = release_times.string
# print(release_time.string)
s = dd.find('p', class_='score').contents # 分数
score = s[0].string+s[1].string # 把分数的整数部分和小数部分拼接
# print(score[0].string+score[1].string) list.append([index,movie,release_time,score]) # 把每一部电影的排名、名称、上映时间、分数添加到一个列表,再追加到一个大列表
print(list)
上述代码的重点在于for循环中信息是如何提取,然后组合的,思路如下:

(1)先提取出页面中所有的<dd>标签对,通过for循环把每组<dd>标签赋给一个dd变量,每一个dd变量都是一个bs4元素的Tag对象;

(2)得到dd标签的返回对象后,可以直接使用find方法来提取dd标签的子标签(开始陷入了一个误区,因为打印出的dd内容是标签元素,然后就想着能不能再把它传进beautifulsoup,
生成一个新的beautifulsoup对象,实际证明不行,因为dd的类型已经是<class 'bs4.element.Tag'>了,而之前传进去的html=r.text的类型是<class 'str'>,很明显不能这样干!!
所以想不通时就打印一下对象类型看看是啥) (3)提取排名--使用 dd.i.string,dd.i表示提取dd标签下的第一个i标签,刚好排名信息就在dd标签下的第一个i标签,加上.string,表示提取文本 (4)提取电影名称--使用 dd.find('p', class_='name').string,提取dd标签下class属性为name的p标签,因为电影名称就在这个p标签下 (5)提取上映时间--使用 dd.find('p', class_='releasetime') (6)提取分数--因为分数分为2部分,整数部分和小数部分,且分别属于一个p标签下的i标签,这样用tag.contents方法(tag的 .contents 属性可以将tag的子节点以列表的方式输出),
然后再将2部分拼接形成完整分数,如下:dd.find('p', class_='score').contents[0].string + dd.find('p', class_='score').contents[1].string

3.完整代码

# coding: utf-8
# author: hmk import requests
from bs4 import BeautifulSoup
import bs4
import pymysql.cursors def get_html(url, header):
try:
r = requests.get(url=url, headers=header, timeout=20)
r.encoding = r.apparent_encoding
if r.status_code == 200:
return r.text
else:
return None
except:
return None def get_data(html, list_data):
soup = BeautifulSoup(html, 'html.parser')
dd = soup.find_all('dd')
for t in dd:
if isinstance(t, bs4.element.Tag): # 判断t是否为bs4的tag对象(因为解析出的dd标签中可能有空行)
ranking = t.i.string # 排名
movie = t.find('p', class_='name').string
release_time= t.find('p', class_='releasetime').string
score = t.find('p', class_='score').contents[0].string + t.find('p', class_='score').contents[1].string
list_data.append([ranking, movie, release_time, score]) def write_sql(data):
conn = pymysql.connect(host='localhost',
user='root',
password='',
db='test',
charset='utf8')
cur = conn.cursor() for i in data:
"""这里的data参数是指正则匹配并处理后的列表数据(是一个大列表,包含所有电影信息,每个电影信息都存在各自的一个列表中;
对大列表进行迭代,提取每组电影信息,这样提取到的每组电影信息都是一个小列表,然后就可以把每组电影信息写入数据库了)"""
movie = i # 每组电影信息,这里可以看做是准备插入数据库的每组电影数据
sql = "insert into maoyan_movie(ranking,movie,release_time,score) values(%s, %s, %s, %s)" # sql插入语句
try:
cur.execute(sql, movie) # 执行sql语句,movie即是指要插入数据库的数据
conn.commit() # 插入完成后,不要忘记提交操作
print('导入成功')
except:
print('导入失败')
cur.close() # 关闭游标
conn.close() # 关闭连接 def main():
start_url = 'http://maoyan.com/board/4'
depth = 10 # 爬取深度(翻页)
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "maoyan.com",
"Referer": "http://maoyan.com/board",
"Upgrade-Insecure-Requests": "",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36"} for i in range(depth):
url = start_url + '?offset=' + str(10 * i)
html = get_html(url, header)
list_data = []
get_data(html, list_data)
write_sql(list_data)
print(list_data) if __name__ == "__main__":
main()

猫眼电影爬取(二):requests+beautifulsoup,并将数据存储到mysql数据库的更多相关文章

  1. 爬取网贷之家平台数据保存到mysql数据库

    # coding utf-8 import requests import json import datetime import pymysql user_agent = 'User-Agent: ...

  2. 猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库

    前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...

  3. 猫眼电影爬取(三):requests+pyquery,并将数据存储到mysql数据库

    还是以猫眼电影为例,这次用pyquery库进行爬取 1.简单demo,看看如何使用pyquery提取信息,并将提取到的数据进行组合 # coding: utf-8 # author: hmk impo ...

  4. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  5. 04 Python网络爬虫 <<爬取get/post请求的页面数据>>之requests模块

    一. urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib ...

  6. 单线程多任务协程vip电影爬取

    单线程多任务协程vip电影爬取 ​ --仅供学习使用勿作商用如有违规后果自负!!! 这几天一直在使用python爬取电影,主要目的也是为了巩固前段时间强化学习的网络爬虫,也算是一个不错的检验吧,面对众 ...

  7. Scrapy实战篇(二)之爬取链家网成交房源数据(下)

    在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例.编写pipelines.py ...

  8. python3 爬取汽车之家所有车型数据操作步骤(更新版)

    题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...

  9. Scrapy实战篇(七)之爬取爱基金网站基金业绩数据

    本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...

随机推荐

  1. 如何搭建一个 MySQL 分布式集群

    1.准备集群搭建环境 使用6台虚拟机来搭建 MySQL分布式集群 ,相应的实验环境与对应的MySQL节点之间的对应关系如下图所示: 管理节点(MGM):这类节点的作用是管理MySQLCluster内的 ...

  2. Ubuntu 安装 VS code

    sudo snap install --classic vscode 没有snap就先装snap,是的,就是这么简单.

  3. linux 压缩工具

    gzip gunzip zcat bzip2 bunzip2 bzcat xz unxz xzcat a:  gzip 用法 # gzip file  压缩文件 不会保留源文件 直接生成 file.g ...

  4. 在VS2010中使用Git

    转载:https://www.cnblogs.com/oec2003/archive/2012/11/13/2768860.html 一. 安装Git命令行,下载地址:http://code.goog ...

  5. python --- 25 模块和包

    一.模块 1.导入方式 自己创建的模块名称 切不可和 内置模块的一样 ①  import  模块 ②  import 模块 as  名      设置在此空间的名称 ③  from 模块 import ...

  6. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解

    题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...

  7. Baseline

    Baseline Baselines an existing database, excluding all migrations upto and including baselineVersion ...

  8. 【解决办法】Undefined command/function 'mapminmax'.

    原因: 低版本7.0中没有mapminmax这个函数,对应的归一化函数是premnmx和postmnmx,具体请查看着两个函数的用法升级到2009就肯定可以正常使用这个函数了 解释: premnmx. ...

  9. [蓝桥] 基础练习 十进制转十六进制 (java)

    问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式.它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15.十六进制的计数方法是满1 ...

  10. 【Hadoop 分布式部署 四:配置Hadoop 2.x 中主节点(NN和RM)到从节点的SSH无密码登录】

    *******************                一定要使这三台机器的用户名相同,安装目录相同          ************* SSH 无密钥登录的简单介绍(之前再搭 ...