python爬虫——豆瓣电影Top250

主要功能
1.利用lxml爬取豆瓣电影top250https://movie.douban.com/top250
2.用xpath确定所爬取数据的位置
3.获取数据,将数据写到txt文档中保存

实现步骤
1.网页分析,进入网站(本文使用的是谷歌浏览器)
豆瓣电影top250

2.按F12打开开发者工具,找到Elements,进行网页内容的分析
这里写图片描述

这里写图片描述

3.我们发现,网页里面有很多<li>...</li>标签,而且每一个标签里面都有一个电影的信息。我们想要的就是标签里面的文字信息。
这里写图片描述
这里写图片描述
4.所有的信息都在class属性为info的div标签里,可以先把这个节点取出来 //*[@id=”content”]/div/div[1]/ol
这里写图片描述

这里我们介绍一下xpath的语法格式:
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

使用实例

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

5.知道xpath的用法后,我们就可以轻松的拿到我们想要的信息了!!!
影片名称 :title = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0]
导演演员信息:info = i.xpath('div[@class="bd"]/p[1]/text()')
评分:rate = i.xpath('//span[@class="rating_num"]/text()')[0]
评论人数:comCount = i.xpath('//div[@class="star"]/span[4]/text()')[0]

6.已经知道如何获取电影信息了,现在的任务是找到请求网址,我们可以翻页寻找网址的规律,看看第二页,第三页……网址是什么样的。
这里写图片描述
这里写图片描述
这里写图片描述
不难发现规律,只是每页网址的start=发生变化。我们可以使用for循环来请求每页网址,

for i in range(10): 
    url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)

除此之外,我们也可利用xpath获取后页的链接(//div[@class=”paginator”]/span[@class=”next”]/a/@href),与‘https://movie.douban.com/top250’拼接,同样可以获取下一页地址。
这里写图片描述

完整代码

# coding:utf-8 
import requests 
from lxml import html 
k = 1 
for i in range(10): 
    url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25) 
    con = requests.get(url).content
    sel = html.fromstring(con) 

    # 所有的信息都在class属性为info的div标签里,可以先把这个节点取出来 //*[@id="content"]/div/div[1]/ol
    for i in sel.xpath('//div[@class="info"]'): 

        # 影片名称 
        title = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0] 
        #print(title)
        info = i.xpath('div[@class="bd"]/p[1]/text()') 
        # 导演演员信息 
        info_1 = info[0].replace(" ", "").replace("\n", "") 
        # 上映日期 
        date = info[1].replace(" ", "").replace("\n", "").split("/")[0] 
        # 制片国家 
        country = info[1].replace(" ", "").replace("\n", "").split("/")[1] 
        # 影片类型 
        geners = info[1].replace(" ", "").replace("\n", "").split("/")[2] 
        # 评分 
        rate = i.xpath('//span[@class="rating_num"]/text()')[0] 
        # 评论人数 
        comCount = i.xpath('//div[@class="star"]/span[4]/text()')[0] 

        # 打印结果看看 
        print ("TOP%s" % str(k))
        print( title, info_1, rate, date, country, geners, comCount )

        # 写入文件 
        with open("top250.txt", "a",encoding='utf-8') as f: 
            f.write("TOP%s\n影片名称:%s\n评分:%s %s\n上映日期:%s\n上映国家:%s\n%s\n" % (k, title, rate, comCount, date, country, info_1)) 

            f.write("==========================\n") 

        k += 1

扩展

将爬取的数据存入Mysql数据库

1.新建数据库crawl,并在数据库crawl中新建表doubanmovie,所建表如图所示。

这里写图片描述
这里写图片描述

2.对上面的代码稍作修改,将存取到TXT文档改为数据库,完整代码如下:

# coding:utf-8
import requests
import pymysql
from lxml import html
k = 1
for i in range(10):
    url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)
    con = requests.get(url).content
    sel = html.fromstring(con)
    # 所有的信息都在class属性为info的div标签里,可以先把这个节点取出来 //*[@id="content"]/div/div[1]/ol
    for i in sel.xpath('//div[@class="info"]'):

        # 影片名称
        title = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0]
        #print(title)
        info = i.xpath('div[@class="bd"]/p[1]/text()')
        # 导演演员信息
        info_1 = info[0].replace(" ", "").replace("\n", "")
        # 上映日期
        date = info[1].replace(" ", "").replace("\n", "").split("/")[0]
        # 制片国家
        country = info[1].replace(" ", "").replace("\n", "").split("/")[1]
        # 影片类型
        geners = info[1].replace(" ", "").replace("\n", "").split("/")[2]
        # 评分
        rate = i.xpath('//span[@class="rating_num"]/text()')[0]
        # 评论人数
        comCount = i.xpath('//div[@class="star"]/span[4]/text()')[0]

        # 打印结果看看
        print ("TOP%s" % str(k))
        print( title, info_1, rate, date, country, geners, comCount )


        connection=''
        try:
            # 获取一个有效的数据库连接对象,此处填写你的数据库信息,特别注意charset一定要写成'utf8',不能写成'utf-8'。
            connection = pymysql.connect(host='localhost', port=3306,
                                         user='root', password='mysql',
                                         db='crawl', charset='utf8')
            if connection:
                print("[mysql]>>正确获取数据库的连接对象")

            # 创建一个游标对象
            curosr = connection.cursor()
            print('[mysql]正确获取游标对象')
            # 设置插入数据的sql语句模板
            sql = "insert into doubanmovie VALUES (null,'%d','%s','%s,','%s','%s','%s','%s')" % (k, title, rate, comCount, date, country, info_1)
            print('[mysql]>>%s' % sql)

            # 使用游标对象发送sql语句并将服务器结果返回
            affectedRows = curosr.execute(sql)
            msg = '[mysql]>>写入操作成功' if affectedRows > 0 else '[mysql]>>写入失败'
            print(msg)
            # 事务提交
            connection.commit()
            print("[mysql]>>事务提交")
        except:
            connection.rollback()
            print('[mysql]事务回滚')
        finally:
            # 关闭数据库连接
            connection.close()
            print("[mysql]>>关闭数据库连接")
            k += 1

注意事项及功能均在代码注释中。
运行结果如图:
这里写图片描述

如图已将所有信息存入到数据库中!

猜你喜欢

转载自blog.csdn.net/qq_41251963/article/details/81605331