python爬虫 提取豆瓣Top250电影信息_FouforPast的博客-程序员宅基地

技术标签: 爬虫  Python  

思路很简单,先将原网页爬取出来,然后用正则表达式、BeautifulSoup和xpath3种方法提取想要的信息,这里暂时先只爬取电影名、导演、评分和标语。

import re
import csv
import requests
from lxml import etree
from bs4 import BeautifulSoup
from urllib.parse import urlencode

root = 'https://movie.douban.com/top250'
para = {
    'start': 0, 'filter': ''}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                         ' Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}

# 正则表达式
writedata = []
pattern = re.compile(r'<li>.*?<div class="info">.*?<span class="title">(?P<name>.*?)</span>'
                     r'.*?<p class="">(?P<director>.*?)&nbsp'
                     r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                     r'.*?<span class="inq">(?P<quote>.*?)</span>', re.S)
for i in range(10):
    para['start'] = i * 25
    url = root + '?' + urlencode(para)
    resp = requests.get(url, headers=headers)
    for i in pattern.finditer(resp.text):
        writedata.append([i.group('name'), i.group('director').strip(), i.group('score'), i.group('quote')])
    resp.close()

# BeautifulSoup
writedata = []
for i in range(10):
    para['start'] = i * 25
    url = root + '?' + urlencode(para)
    resp = requests.get(url, headers=headers)
    # 生成bs对象
    bs = BeautifulSoup(resp.text, 'html.parser')
    # 从bs对象中查找数据
    items = bs.find_all(name='div', attrs={
    'class': 'info'})
    for item in items:
        name = item.find_all(name ='span', class_='title')[0].text
        director = item.find_all(name ='p', class_='')[0].text.strip()
        score = item.find_all(name='span', class_='rating_num')[0].text
        quote = item.find_all(name='span', class_='inq')
        if(quote == []):
            quote = ""
        else:
            quote = item.find_all(name='span', class_='inq')[0].text
        writedata.append([name, director, score, quote])
    resp.close()

# xpath
writedata = []
for i in range(10):
    para['start'] = i * 25
    url = root + '?' + urlencode(para)
    resp = requests.get(url, headers=headers)
    tree = etree.HTML(resp.text)
    for j in range(1, 26):
        name = tree.xpath(f'//*[@id="content"]/div/div[1]/ol/li[{j}]/div/div[2]/div[1]/a/span[1]/text()')[0]
        # 一次提取无法将导演信息准确提取出,需要利用正则表达式再提取一次
        message = tree.xpath(f'//*[@id="content"]/div/div[1]/ol/li[{j}]/div/div[2]/div[2]/p[1]/text()[1]')[0].strip()
        director = re.search(r'导演: (?P<director>.*?) ', message, re.S).group()
        score = tree.xpath(f'//*[@id="content"]/div/div[1]/ol/li[{j}]/div/div[2]/div[2]/div/span[2]/text()')[0]
        quote = tree.xpath(f'//*[@id="content"]/div/div[1]/ol/li[{j}]/div/div[2]/div[2]/p[2]/span/text()')
        if(quote == []):
            quote = ""
        else:
            quote = quote[0]
        writedata.append([name, director, score, quote])

    resp.close()

# 保存
with open('films.csv', 'w', newline="", encoding='utf-8') as f:
    csvwriter = csv.writer(f)
    csvwriter.writerow(['name', 'director', 'score', 'quote'])
    csvwriter.writerows(writedata)
f.close()

3种方法作比较,xpath是最简单的,在chrome中找到想要提取的元素后可以直接右键复制路径,不过可能需要正则表达式进行进一步处理;正则表达式写起来较为复杂,但是运行速度和效率都最高。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43919753/article/details/119090200

智能推荐

swing可视化编程-使用label添加图片_a box of Sweets的博客-程序员宅基地_jlabel添加图片

-- 感谢代码和视频提供者:黎海波童鞋 本篇是使用过了java中的可视化swing图形界面编程,讲解如何使用JLabel文本标签显示图片。1、关键代码: JLabel lb=new JLabel();//创建一个标签对象 ImageIcon icon=new ImageIcon("images/b...

kettle使用笔记(安装连接篇)_仔仔1993的博客-程序员宅基地

首先声明:此文秉承不泄露公司信息的原则 1 Kettle安装与基本概念 1.1 安装介绍 测试完之后发现6.0版本最稳定。本文采用的版本为pdi-ce-6...

Springboot实现JPA_甄齐才的博客-程序员宅基地

项目结构图 pom.xml文件如下<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.

mysql为什么需要优化_第二颗大白菜的博客-程序员宅基地_mysql为什么要进行优化

mysql为什么需要优化今天用一篇文章讲讲为什么sql需要优化,天天讲怎么优化,那么到底为啥需要优化呢?不知道各位同学有没有深思过这个问题。今天我们一起来思考一下。先贴上Mysql的官方的一段话当使用MyISAM存储引擎时,MySQL使用极快速的表锁定,以便允许多次读或一次写。使用该存储引擎的最大问题出现在同一个表中进行混合稳定数据流更新与慢速选择。如果这只是某些表的问题,你可以使用另一个存储引擎。参见第15章:存储引擎和表类型。​MySQL可以使用事务表和非事务表。为了更容易..

华为mate40pro是鸿蒙系统吗,mate40Pro和40RS能用上鸿蒙系统吗_贺志成Tallis.He的博客-程序员宅基地

[分享交流]mate40Pro和40RS能用上鸿蒙系统吗8876电梯直达huafen210861086新学乍练发表于 2020-12-18 12:30:08来自:HUAWEI Mate 40 Pro最新回复 2020-12-19 09:50:21如题好多人都说不能用上鸿蒙系统林泽徐独步江湖发表于 2020-12-18 12:30:52来自:HUAWEI Mate 40 Pro明年可以点评mate4...

C语言关于数组与指针内容小结_Loving_初衷的博客-程序员宅基地

数组的基本概念什么是数组:数组就是:数组是相同类型的元素的一个集合       类型说明符 数组名 [常量表达式];其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:int a[10]; /* 说明整型数组a,有10个元素 */float b[10], c[20]; /* 说明实

随便推点

加密货币企业在白俄罗斯正式合法_区块链铅笔的博客-程序员宅基地

点击上方“蓝色字”可关注我们!暴走时评:去年12月由白俄罗斯总统亚历山大·卢卡申科(Alexander Lukashenko)签署的《数字经济发展》总统令如今已于3月28日正式生效。自此,加密货币企业在俄罗斯正式得到法律认可。前所未有的自由以及各种慷慨的激励措施舞步吸引着加密货币企业前往该国进行投资。只要加密货币行业的个人企业家及企业实体在白俄罗斯高新技术园区(HTP)登记注册,就可以在该国随时随

keepalived_weixin_33697898的博客-程序员宅基地

keepalived(高可用软件)什么是高可用? 拿lvs来举例,我设置的是rr算法,当我用户请求进来,经过调度器,调度器通过算法把请求分给后端RS,如果我后端有一台RS宕机了,那么我调度器是不知道的,还是会一直给它发送报文,而用户时而能收到返回请求,时而收到请求超时,还有一种情况,就是我调度器故障,所谓的单点故障,lvs都是没有办法排除的,它只是一款负载均衡软件。在节点出现故...

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof详解_黑旋风李鬼的博客-程序员宅基地

来源:https://my.oschina.net/feichexia/blog/196575现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ......这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大...

interrupt用法C语言,C语言应用-6-Interrupt.pdf_林孟潇的博客-程序员宅基地

C语言应用-6-Interrupt第 6 章 中断系统的 C 语言程序设计526.1 中断系统 526.1.1 中断源 526.1.2 中断优先级和中断入口地址546.2 中断控制 546.2.1 中断控制的寄存器 546.2.2 中断响应过程566.3 中断控制的相关 C 函数586.4 中断系统的应用实例 606.4.1 单中断源的应用 606.4.2 多中断源应用65北...

个人计算机一词由来,多媒体一词的由来_爱探索发现的博客-程序员宅基地

多媒体,在计算机系统中,组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。使用的媒体包括文字、图片、照片、声音 (包含音乐、语音旁白、特殊音效)、动画和影片。多媒体是超媒体(Hypermedia)系统中的一个子集,而超媒体系统是使用超链接 (Hyperlink)构成的全球信息系统,全球信息系统是因特网上使用TCP/IP协议和UDP/IP协议的应用系统。二维的多媒体网页使用HTML、XML等...

Map的Iterator输出的问题_南下Debugging的博客-程序员宅基地

Map集合使用Iterator进行遍历输出Map.Entry

推荐文章

热门文章

相关标签