待爬取的网页地址为https://maoyan.com/board/4,本次以requests、BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名、图片、名称、演员、上映时间与评分提取出来并保存到文件。


初步分析:所有网页上展示的内容后台都是通过代码来完成的,所以,不管那么多,先看源代码

F12打开chrome的调试工具,从下面的图可以看出,实际上每一个电影选项(排名、分数、名字等)都被包括在dd标签中。


为了能把这些影片信息爬取出来,可以有以下两种思路。

思路一:把电影的每一个要素的列表先提取出来,类似如下:

titile = ['霸王别姬','肖申克的救赎'....],index = [1,2...],

最后从各个列表中选中对应的item拼接成一个个新的列表或字典类型,

类似如下:result = [{'title':'霸王别姬','index':'1'},{'title':'肖申克的救赎','index':'2'.....}

分析:因为要多次进行遍历,思路一的整体逻辑较混乱,容易出错

思路二:把每一个dd标签作为一个整体提取为一个列表,然后对列表的每一项(包含每部影片的各项信息)进行解析提取

分析:很明显,相对第一种思路,第二种思路就更加的清晰明了


下面通过代码来实现思路二的方式:

第一步:获取当前页的网页源代码

def get_current_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
try:
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except RequestException:
return None

第二步:解析当前网页提取出影片信息

def parse_html(html):
soup = BeautifulSoup(html, 'lxml')
dd = soup.select('dd') #css选择器,select是选取所有符合条件的节点,select_one是选取第一个符合条件的节点
for result in dd:
     #生成器的方式更省内存  
yield {
'index': result.select_one('.board-index').text, #获取影片排名
'title':result.select_one('.image-link')['title'], #获取影片名字
'image':result.select_one('.poster-default')['src'], #获取影片图片链接
'star':result.select_one('.star').text.strip(), #获取演员信息
'realeasetime':result.select_one('.releasetime').text.strip(),#获取上映时间
'score':result.select_one('.integer').text+result.select_one('.fraction').text #获取影片得分
}

第三步:将结果保存到文件

def save_to_file(content):
with open('result.txt', 'a', encoding='utf-8') as f: #以追加的形式写入文件
f.write(json.dumps(content, ensure_ascii=False) + '\n')

以上实现了单页影片信息的爬取与存储,下面探索怎么实现翻页后的页面爬取

思路:既然要翻页,那就先点击下一页看看,找找规律,从下图可以看出url后面多了个?offset=10,继续翻页显示为?offset=20,最后一页显示为?offset=90,这就找到规律了,每一个url后面的url都等于页面号x10(页面号从0计数)。

得出规律之后我们开始写主函数

第四步:写主函数

def main(offset):
url = 'https://maoyan.com/board/4?offset=' + str(offset * 10)
html = get_current_page(url)
for result in parse_html(html):
print(result)
save_to_file(result)

第五步:写函数入口

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

最后运行的结果:

整个的爬取过程就是这样,完整代码查看可以点击这里

 

 

python3爬虫爬取猫眼电影TOP100(含详细爬取思路)的更多相关文章

  1. 爬虫系列(1)-----python爬取猫眼电影top100榜

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...

  2. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  3. # [爬虫Demo] pyquery+csv爬取猫眼电影top100

    目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.co ...

  4. Python爬虫项目--爬取猫眼电影Top100榜

    本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构,  ...

  5. 40行代码爬取猫眼电影TOP100榜所有信息

    主要内容: 一.基础爬虫框架的三大模块 二.完整代码解析及效果展示 1️⃣  基础爬虫框架的三大模块 1.HTML下载器:利用requests模块下载HTML网页. 2.HTML解析器:利用re正则表 ...

  6. python 爬取猫眼电影top100数据

    最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel. 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据 ...

  7. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...

  8. 用requests库爬取猫眼电影Top100

    这里需要注意一下,在爬取猫眼电影Top100时,网站设置了反爬虫机制,因此需要在requests库的get方法中添加headers,伪装成浏览器进行爬取 import requests from re ...

  9. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  10. Python Spider 抓取猫眼电影TOP100

    """ 抓取猫眼电影TOP100 """ import re import time import requests from bs4 im ...

随机推荐

  1. C#判断字符串是否为数字字符串

    在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现.[方法一]:使用 try{} catch{} 语句.      我们可以在try语句块中试图将str ...

  2. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  3. BZOJ4651 NOI2016网格(割点)

    首先显然可以通过孤立角落里的跳蚤使其不连通,所以只要有解答案就不会大于2.同样显然的一点是当且仅当跳蚤数量<=2且连通时无解.做法其实也很显然了:特判无解,若跳蚤不连通输出0,否则看图中是否无割 ...

  4. 斜率dp+cdq分治

    写在前面 这个东西应该是一个非常重要的套路......所以我觉得必须写点什么记录一下,免得自己忘掉了 一直以来我的斜率dp都掌握的不算很好......也很少主动地在比赛里想到 写这个的契机是noi.a ...

  5. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  6. POJ2396:Budget(带下界的网络流)

    Budget Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8946   Accepted: 3327   Special ...

  7. matlab求最大公约数和最小公倍数

    最大公约数:(函数) function n = zuidagongyueshu(a,b) if(a>b) tem = a; b = a; a = tmp; end for i=1:a c = r ...

  8. Spring - IoC(1): Spring 容器

    BeanFactory & ApplicationContext org.springframework.beans.factory.BeanFactory 是最基本的 Spring 容器接口 ...

  9. swift中_的用法,忽略默认参数名。

    swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...

  10. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

    题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...