datawhale任务2-爬取豆瓣top250


正则表达式

正则表达式的功能用于实现字符串的特定模式精确检索或替换操作。

常用匹配模式

模式 描述
\w 匹配字母、数字及下划线
\W 匹配不是字母、数字或下划线的字符
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空白字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符,添加修饰符,可匹配任意字符
[...] 用来表示一组字符,单独列出,比如[amk]则匹配a,m,k
[^...] 不在[]中的字符,比如[^abc],即除了a,b,c之外的字符
* 匹配0个或多个表达式
+ 匹配1个或多个表达式
? 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前表达式
{n, m} 匹配n到m次由前面正则表达式定义的片段,贪婪方式
a 管道符 b 匹配a或b
() 匹配括号内的表达式,也表示一个组

常用修饰符

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别匹配
re.M 多行匹配,影响^$
re.S 使.匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符,这个标志影响\w,\W,\b\B
re.X 该标志通过给予你更灵活的格式 以便你将正骨则表达式写着更易于理解

基本方法

  • match():以表达式开头进行匹配,一旦开头不匹配,整个匹配就会失败,返回None
  • search():扫描整个字符串,返回第一个成功匹配的字符中,否则返回None
  • findall():搜索整个字符串,返回匹配成功的所有字符串,否则返回空列表

豆瓣250页面分析

豆瓣Top250是包含250部电影,此次爬取的数据为之250部电影的排名,电影名,导演及国家。

url为:https://movie.douban.com/top250?start=0,默认每页有25部电影信息。

每往后翻一页,url中start参数每次即增加25,即250部电影,10页。

豆瓣有反爬虫,如果过多请求会被封,所以先建立一个文件夹用于存储以爬取的网页,如果下次爬取本地有相应的文件,就不会发起网络请求,从而节省下时间,也不会吸引豆瓣反爬系统的注意。

    if 'cached' not in os.listdir('./'):
os.system('mkdir cached')
listdir = os.listdir("./cached")
path = './cached/'
def download(index, url, listdir, path):
# 下标,目标网址,已缓存的文件,文件保存路径
target_file = "{}.html".format(index)
target_url = url.format(index * 25)
if target_file not in listdir:
# 对应的 html 没有下载下来
html = requests.get(target_url, headers=headers)
html.encoding = 'utf-8'
with open(path + target_file, 'w+') as file:
file.write(html.text)
html = html.text
else:
with open(path + target_file, 'r') as file:
html = file.read()
return html

要爬取的信息是排名,电影名,导演,国家

排名在字符串的位置如下

通过浏览器的开发者面板看到是这样的

实际是这样的

电影名位于<span class='title'>XXX</span>中,其中有些有两个<span class='title'>,为避免数据混乱,故只采用一个第一个title,且导演名在信息中的相对位置是肯定的且每部电影都有导演的相关信息,在<p class=""></p>中,故将三都的信息均写于一个正则表达式

three_pattern = re.compile(('<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>'
'.*?<p class="">.*?导演:(.*?)&nbsp;'), re.S)

刚开始时原是把国家的正则匹配也写在一起,后来发现那样会导致有些数据无法匹配,所以分开写,如下

nation_pattern = re.compile('<br>.*?/&nbsp;(.*?)&nbsp;/.*?</p>', re.S)

完整代码

"""
datawhale爬虫任务2
任务:爬取豆瓣电影250
分析 URL,有一个GET参数,start每次变化增加250
https://movie.douban.com/top250?start=0
鉴于豆瓣电影会反爬虫,故将内容先爬下本地,再分析
"""
import requests
import os
import re # (提取名次,片名,导演),(国家)
three_pattern = re.compile(('<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>'
'.*?<p class="">.*?导演:(.*?)&nbsp;'), re.S)
nation_pattern = re.compile('<br>.*?/&nbsp;(.*?)&nbsp;/.*?</p>', re.S) headers = {
'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/68.0.3440.106 Safari/537.36')
} class Movie(object):
def __init__(self, rnd, n):
# rnd: 名次,名字,导演
# n: 国家
self.info = {
'排名': rnd[0],
'电影名': rnd[1],
'导演': rnd[2],
'国家': n
} def __repr__(self):
return str(self.info) def download(index, url, listdir, path):
# 下标,目标网址,已缓存的文件,文件保存路径
target_file = "{}.html".format(index)
target_url = url.format(index * 25)
if target_file not in listdir:
# 对应的 html 没有下载下来
html = requests.get(target_url, headers=headers)
html.encoding = 'utf-8'
with open(path + target_file, 'w+') as file:
file.write(html.text)
html = html.text
else:
with open(path + target_file, 'r') as file:
html = file.read()
return html def parse(html):
# 分析面页面,提取数据
# 名次,影片名称,导演
rank_name_dire = re.findall(three_pattern, html)
# 国家
nation = re.findall(nation_pattern, html)
info = [Movie(i[0], i[1]) for i in zip(rank_name_dire, nation)]
for i in info:
print(i) def main():
if 'cached' not in os.listdir('./'):
os.system('mkdir cached')
listdir = os.listdir("./cached")
path = './cached/'
url = 'https://movie.douban.com/top250?start={}'
for i in range(10):
html = download(i, url, listdir, path)
parse(html)
print("结束") if __name__ == '__main__':
main()

参考资料

正则表达式和豆瓣Top250的爬取练习的更多相关文章

  1. 豆瓣电影信息爬取(json)

    豆瓣电影信息爬取(json) # a = "hello world" # 字符串数据类型# b = {"name":"python"} # ...

  2. Python爬虫入门教程:豆瓣Top电影爬取

        基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一. ...

  3. 艺恩网内地总票房排名Top100信息及其豆瓣评分详情爬取

    前两天用python2写的一个小爬虫 主要实现了从http://www.cbooo.cn/Alltimedomestic这么个网页中爬取每一部电影的票房信息等,以及在豆瓣上该电影的评分信息 代码如下 ...

  4. python 豆瓣图片的爬取

    豆瓣图片的抓取:在python中实现生产者和消费者模型的实现,大家可以参考这篇文章 http://www.bkjia.com/Pythonjc/978391.html 个人认为是讲的比较易懂的,只要看 ...

  5. 豆瓣读书top250数据爬取与可视化

    爬虫–scrapy 题目:根据豆瓣读书top250,根据出版社对书籍数量分类,绘制饼图 搭建环境 import scrapy import numpy as np import pandas as p ...

  6. Scrapy教程--豆瓣电影图片爬取

    一.先上效果 二.安装Scrapy和使用 官方网址:https://scrapy.org/. 安装命令:pip install Scrapy 安装完成,使用默认模板新建一个项目,命令:scrapy s ...

  7. 豆瓣网post 爬取带验证码

    # -*- coding: utf- -*- import scrapy import requests from ..bao.jiema import get_number fromdata = { ...

  8. 正则表达式_爬取豆瓣电影排行Top250

    前言: 利用简单的正则表达式,获取响应内容爬取数据. Part1 正则表达式(Regular Expression) 1.1 简介 正则表达式,又称规则表达式,它是一种文本模式,就是通过事先定义好的一 ...

  9. python爬取豆瓣前25个影片内容的正则表达式练习

    通过python正则表达式获取豆瓣top250的第一页的25个影片排名,影片名字,影片连接,导演,主演,上映日期,国家,剧情,评分,评价人数的内容 网页html内容: <ol class=&qu ...

随机推荐

  1. Spark MLlib LDA 基于GraphX实现原理及源代码分析

    LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类.眼下,广泛运用在文本主题聚类中. LDA的开源实现有 ...

  2. Python——迭代器和解析(3)

    用迭代工具模拟zip和map ====================================================================== 我们已经知道了zip怎样组合 ...

  3. Centos7操作系统部署指南

    一.硬件环境: Dell R620 二.软件环境: Centos6.4 X86_64 +KVM Windows7+vnc 三.安装说明 操作系统更新之迅速,让作为新手的系统运维人员有点措手不及,相对于 ...

  4. GNU TeXmacs 1.99.8 发布,所见即所得科学编辑器(看看老实的GUI)

    GNU TeXmacs 1.99.8 已发布,这是一个支持各种数学公式的所见即所得编辑器,可以用来编辑文本.图形.数学.交互内容,它的界面非常友好,并且内置高质量的排版引擎. 更新内容: bug 修复 ...

  5. Android系统之Recovery移植教程 【转】

    本文转载自:http://luckytcl.blog.163.com/blog/static/14258648320130165626644/ recovery的移植,这方面的资料真实少之又少啊,谷歌 ...

  6. hdoj--3488--Tour(KM)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submi ...

  7. [POJ 3621] Sightseeing Cows

    [题目链接] http://poj.org/problem?id=3621 [算法] 01分数规划(最优比率环) [代码] #include <algorithm> #include &l ...

  8. LINUX/UNIX找回删除的文件

    当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹.管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志.有时可以通过lsof来恢复这些 ...

  9. php简单测试slim框架的功能

    php简单测试slim框架的功能 监听主路径/ $app->get( '/', function () { $template = <<<EOT<!DOCTYPE htm ...

  10. Java设计模式-策略模式详解

    前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...