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. 沁园春&#183;咏史

    沁园春·咏史 文/天地尘埃2020 谁是谁非?宋桧连金,武穆饮生. 叹止渴饮鸩.灰飞烟灭:诵传千载:长跪无声. 懿旨朱批?直书秉笔?天地一根秤自衡. 何曾忘! 这英雄千古,犹恨空横! 幽幽何觅忠魂.耻 ...

  2. 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题

    I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  3. win7配置免安装mysql5.6.19过程具体解释

    本文主要介绍免安装配置mysql5.6.19的过程,整个过程中自己出现非常多次失误,经过整理,现将一次可成功的过程记录下来,供大家參考. 准备 在mysq官网 http://dev.mysql.com ...

  4. java根据内容生成二维码图片

    package util; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; ...

  5. HTTP详解工作原理

    1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...

  6. Running the app on your device

    So far, you've run the app on the Simulator. That's nice and all but probably notwhy you're learning ...

  7. POJ1837 Balance 背包

    题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子(每个钩子有相对于中心的距离,左负右正),有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数. 将每个砝码看作一组,组内各个物品 ...

  8. mysql查询orderby

    --按某一字段分组取最大(小)值所在行的数据 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的 ...

  9. C - Queue at the School

    Problem description During the break the schoolchildren, boys and girls, formed a queue of n people ...

  10. 第5章分布式系统模式 Data Transfer Object(数据传输对象)

    正在设计一个分布式应用程序,为了满足单个客户端请求,您发现自己对一个远程接口发出了多个调用,而这些调用所增加的响应时间超出了可接受的程度. 影响因素 在与远程对象通信时,请考虑下列需要权衡的因素: 远 ...