猫眼电影爬取(二):requests+beautifulsoup,并将数据存储到mysql数据库

上一篇通过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": "1",
              "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 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:
        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=‘123456‘,
                           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": "1",
              "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()

原文地址:https://www.cnblogs.com/hanmk/p/9229529.html

时间: 2024-10-03 16:39:35

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

Scrapy爬取慕课网(imooc)所有课程数据并存入MySQL数据库

爬取目标:使用scrapy爬取所有课程数据,分别为 1.课程名 2.课程简介 3.课程等级 4.学习人数 并存入MySQL数据库  (目标网址  http://www.imooc.com/course/list) 一.导出数据文件到本地 1.新建imooc项目 1 scrapy startproject imooc 2.修改 items.py,添加项目item 1 from scrapy import Item,Field 2 class ImoocItem(Item): 3 Course_na

使用scrapy简易爬取豆瓣9分榜单图书并存放在mysql数据库中

注:大部分内容参考http://www.cnblogs.com/voidsky/p/5490798.html 首先创建一个项目douban9fen [email protected]:~/pachong$ scrapy startproject douban9fen New Scrapy project 'douban9fen', using template directory '/usr/local/lib/python2.7/dist-packages/scrapy/templates/p

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

还是以猫眼电影为例,这次用pyquery库进行爬取 1.简单demo,看看如何使用pyquery提取信息,并将提取到的数据进行组合 # coding: utf-8 # author: hmk import requests from pyquery import PyQuery as pq url = 'http://maoyan.com/board/4' header = {"Accept": "text/html,application/xhtml+xml,applica

[python爬虫] Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取CSDN的博客摘要等信息.通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的.这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段发表的博客多.结合WordCloud分析文章的主题.文章阅读量排名等.        这是一篇基础性的文章,希望对您有所帮助,如果文章中出现错误或不足之处,还请海涵.下一篇文章会简单讲解数据分析的过程. 一.

爬取链家任意城市租房数据(北京朝阳)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 15:56 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市租房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import os

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

python之scrapy爬取数据保存到mysql数据库

1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip install pymysql 4.settings文件,配置信息,包括数据库等 # -*- coding: utf-8 -*- # Scrapy settings for tencent project # # For simplicity, this file contains only setting

用scrapy爬取ttlsa博文相关数据存储至mysql

运维生存时间这个博客内容还是比较详尽的,对与运维技术人员的我来说,是偶尔溜达进来的地方,从中也学习到不少知识,感谢博主的奉献! 这段时间我就通过scrapy来收集下此博客内文章的相关数据,供以后需要从中提取我认为值得看的文章作为数据依据. 今天,要做的事就是把数据先抓取出来,后期再将其数据存储起来. 首先通过命令scrapy genspider ttlsa www.ttlsa.com创建一个蜘蛛程序应用名为ttlsa 其次在ttlsa.py下编写如下代码. # -*- coding: utf-8

层次结构和二维表的关系数据存储

摘:Storing Hierarchical Data in a Database Article(翻译版本) 原文链接:http://shiningray.cn/hierarchical-data-database.html 作者:Gijs Van Tulder 翻译:ShiningRay @ NirvanaStudio 无论你要构建自己的论坛,在你的网站上发布消息还是书写自己的CMS程序,你都会遇到要在数据库中存储层次数据的情况.同时,除非你使用一种像XML的数据库,否则关系数据库中的表都不