原文崔庆才《python3网络爬虫实战》

本文为自学记录,如有侵权,请联系删除

目标:

熟悉正则表达式,以及爬虫流程

获取猫眼TOP100榜单

1、网站分析

目标站点为http://www.manyan.com/board/4,需要获取网站TOP100榜单的影片名称、主演、上映时间、地区、评分等信息都直接显示在network对应的response中,可解析对应的html进行获取。且从第1页到第二页,URL变成http://maoyan.com/board/4?offset=10,比之前多了参数offset=10,对比第2页第3页发现该参数即为翻页参数。

2、获取首页

实现步骤:定义get_one_page()方法,传入url参数,将抓取的页面结果返回,通过main()方法调用。

# 首页
import requests def get_one_page(url):
# 输入headers信息伪装为浏览器
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code ==200:
return response.text
return None def main():
url = 'http://www.maoyan.com/board/4'
html = get_one_page(url)
print(html) main()

 即可把response中的html信息获取下来

2、正则提取

一部电影信息对应的源代码是一个dd的节点

html = '''
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//s0.meituan.net/bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">
主演:张国荣,张丰毅,巩俐
</p>
<p class="releasetime">上映时间:1993-01-01</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div> </div>
</div> </dd>
'''

  获取排名信息

import re
result = re.search('<dd>.*?board-index.*?>(.*?)</i>', html, re.S)
print(result.group(1))

  获取电影图片

tp = re.search('<dd>.*?data-src="(.*?)@.*?c"',html, re.S)

  获取电影名称

mc = re.search('<dd>.*?name">.*?>(.*?)</a>',html,re.S)

  获取主演

zy = re.search('<dd>.*?star">(.*?)</p>',html,re.S)

  获取发布时间

fb = re.search('<dd>.*?releasetime">(.*?)</p>', html ,re.S)

  获取评分

pf = re.search('<dd>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',html,re.S)

  全部链接起来

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)@.*?c.*?name">.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>

   这样一个正则表达式可以匹配一个电影的结果,里面匹配了7个信息,接下来通过findall() 方法提取所有的内容。

def parse_one_page(html):
# 把正则表达式编译成一个正则表达式对象,方便复用
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)@.*?c.*?name">.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',
re.S
)
items = re.findall(pattern, html)
print(items) def main1():
html = '''
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//s0.meituan.net/bs/?f=myfe/mywww:/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">
主演:张国荣,张丰毅,巩俐
</p>
<p class="releasetime">上映时间:1993-01-01</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div> </div>
</div> </dd>
'''
items = parse_one_page(html)
print(items) main1()

  结果

3、写入文件

通过JSON库的jumps()实现字典的序列化,并指定ensure_ascii参数为False ,保证输出结果是中文,而不是Unicode编码

def write_to_file(content):
with open('result.txt','w',encoding='utf-8') as f:
f.write(json.jumps(content, ensure_ascii=False)+'\n')

4、分页爬取

if __name__=='__main__':
for i in range(10):
main(offset=i*10)

5、整合代码

# 抓去首页
import requests
import re
import json
import time
from requests.exceptions import RequestException def get_one_page(url):
try:
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code ==200:
return response.text
return None
except RequestException:
return None def parse_one_page(html):
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)@.*?c.*?name">.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',
re.S
)
items = re.findall(pattern, html)
for item in items:
yield {
'index':item[0],
'image':item[1],
'title':item[2],
# 去除首尾空格,从第4位开始
'actor':item[3].strip()[3:],
'time': item[4].strip()[5:],
'sorce':item[5]+item[6]
} def write_to_file(content):
with open('result.txt','w',encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n') def main(offset):
url = 'http://www.maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item) if __name__=='__main__':
for i in range(10):
main(offset=i*10)
time.sleep(1)

  结果:

【爬虫】-爬取猫眼TOP100的更多相关文章

  1. python爬虫:爬取猫眼TOP100榜的100部高分经典电影

    1.问题描述: 爬取猫眼TOP100榜的100部高分经典电影,并将数据存储到CSV文件中 2.思路分析: (1)目标网址:http://maoyan.com/board/4 (2)代码结构: (3) ...

  2. Python 爬取 猫眼 top100 电影例子

    一个Python 爬取猫眼top100的小栗子 import json import requests import re from multiprocessing import Pool #//进程 ...

  3. 使用Beautiful Soup爬取猫眼TOP100的电影信息

    使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...

  4. 整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案

    最近看崔庆才老师的爬虫课程,第一个实战课程是requests和正则表达式爬取猫眼电影Top100榜单.虽然理解崔老师每一步代码的实现过程,但自己敲代码的时候还是遇到了不少问题: 问题1:获取respo ...

  5. 7.5爬取猫眼Top100电影名单

    2018-7-5 20:22:57 还有有一丢丢成就感!以后可以爬取简单网站了!比如妹子图片,只是现在不知道咋下载! 正则还是刚看,要多去用正则!正则很强大的东西! #!/usr/bin/env py ...

  6. 爬取猫眼TOP100

    学完正则的一个小例子就是爬取猫眼排行榜TOP100的所有电影信息 看一下网页结构: ​ 可以看出要爬取的信息在<dd>标签和</dd>标签中间 正则表达式如下: pattern ...

  7. <scrapy爬虫>爬取猫眼电影top100详细信息

    1.创建scrapy项目 dos窗口输入: scrapy startproject maoyan cd maoyan 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) # -*- ...

  8. python3爬虫爬取猫眼电影TOP100(含详细爬取思路)

    待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...

  9. Python爬取猫眼top100排行榜数据【含多线程】

    # -*- coding: utf-8 -*- import requests from multiprocessing import Pool from requests.exceptions im ...

随机推荐

  1. Hadoop(分布式系统基础架构)---Hive与HBase区别

    对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用.  Hive是什么? Apache Hive是 ...

  2. Android Lint——内嵌于Android Studio的代码优化工具

    Android Lint工具是Android Studio 自带的静态代码工模具,Android Lint是专门针对Android 定制的检查规则,因此可以检查出很多Android特有的代码缺陷.建议 ...

  3. .NET基础 (02).NET运行机制

    .NET运行机制1 .NET程序被编译成什么形式的代码2 JIT是如何工作的3 简述程序集的加载机制4 如何配置程序集的版本策略 1 .NET程序被编译成什么形式的代码 .NET程序在编写完成后,会经 ...

  4. 编写高质量代码改善C#程序的157个建议——建议93:构造方法应初始化主要属性和字段

    建议93:构造方法应初始化主要属性和字段 类型的属性应该在构造方法调用完毕前完成初始化工作.如果字段没有在初始化器中设置初始值,那么它就应该在构造方法中初始化. 类型一旦被实例化,那么它就应该被视为具 ...

  5. C#调用windows命令行(CMD)

    using System.Diagnostics; public static void StartCmd(String command){Process p = new Process();p.St ...

  6. CodeForces 408E Curious Array(组合数学+差分)

    You've got an array consisting of n integers: a[1], a[2], ..., a[n]. Moreover, there are m queries, ...

  7. 一类适合初学者的DP:最大子段和与最大子矩阵

    最近在水简单DP题,遇到了两道层层递进的DP题,于是记录一下 一.最大子段和 题意: 给出一个长度为n(n<=1e5)的序列,求连续子段的最大值 比如说2 3 -4 5 的最大值是6  而 2 ...

  8. PyCharm社区版+Django搭建web开发环境-2

    接上一篇:PyCharm社区版+Django搭建web开发环境-1 1. 创建好django项目并建立app应用:web 2. setting.py:配置app应用 INSTALLED_APPS = ...

  9. 《T-SQL查询》- SQL逻辑处理

    下面列出SQL查询语句的一般形式,以及各个子句被逻辑处理的顺序步骤: (8) SELECT (9) DISTINCT (11) <TOP_specification> <select ...

  10. Nutch 快速入门(Nutch 2.2.1+Hbase+Solr)

    http://www.tuicool.com/articles/VfEFjm Nutch 2.x 与 Nutch 1.x 相比,剥离出了存储层,放到了gora中,可以使用多种数据库,例如HBase, ...