欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫实战:利用beautiful soup爬取猫眼电影TOP100榜单内容-2

程序员文章站 2022-03-02 19:29:55
...

最近学习了 html5 相关的网页标签的基础知识,这个对beautiful soup的应用理解有很多的帮助,于是重新整理了之前的代码。

有兴趣的可以参考。

import os
import requests
from bs4 import BeautifulSoup


file_path = 'D:\python3.6\scrapy\maoyan' 
# 定义文件夹,方便后续check文件夹是否存在
file_name = 'maoyan.txt'  
# 自定义文件名称
file = file_path+'\\'+file_name 
# 创建文件全地址,方便后续引用

url = "http://maoyan.com/board/4"
# 获取url的开始页
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

if os.path.exists(file):
# 如果文件存在,就在程序运行开始头指针开始编辑,即清空原有内容;
# 如果文件不存在,就创建一个新文件
	with open(file, 'w', encoding='utf-8') as f: 
	# 打开目标文件夹中的文件
			f.truncate()
			#清空文件内容,注意:仅当以 "r+" "rb+" "w" "wb" "wb+"等以可写模式打开的文件才可以执行该功能

def get_all_pages(start):
# 自定义获取所有目标pages页的内容的函数
	
	pages=[]
	#定义空列表,加载获取的page内容
	for n in range(0,100,10):
	# 确认offset的步进值,注意把int的n转换为str
	# 遍历所有的url,并获取每一页page的目标内容
		if n==0:
			url=start
		else:
			url=start+'?offset='+str(n)			
		r = requests.get(url, headers=headers) 
		soup = BeautifulSoup(r.content, 'lxml')
		page= soup.find_all(name='dd')	
		# 将取该gage的所有dd节点的内容转换为soup属性		
		pages.extend(page)
		# 利用extend方法扩展pages list内容		
	return pages
	# 返回所有pages list内容
	
text = get_all_pages(url)

for film in text:
# 遍历列表 text中的所有元素,也就是每个dd节点内容
# 这个for循环应该优化成 自定义函数形式;
	dict ={}
	# 创建空dict,用来存放film信息	
	dict['Index']=film.i.string
	# 选取第1个i节点标签的的string值,即film的排行值,并存入字典dict中
	dict['name']=film.a.attrs['title']
	# 选取第1个a节点标签的title属性的名称,即film的名称,并存入字典dict中
	dict['star']=film.find(name='p',attrs={'class': 'star'}).string.strip()
	# 选取第1个节点标签名称为p,且class属性名称为star的string值,并利用strip方法去除文本的前后的空格或者换行,并存入字典dict中

	time=film.find(name='p',attrs={'class': 'releasetime'}).string.strip()
	dict['releasetime']=time[5:15]
	
	# 选取第1个节点标签名称为p,且class属性名称为releasetime的string值,
	# 并利用strip方法去除文本的前后的空格或者换行,并存入字典dict中
	
	
	sco1=film.find(name='i',attrs={'class': 'integer'}).string
	sco2=film.find(name='i',attrs={'class': 'fraction'}).string
	# 选取第1个节点标签名称为i,且class属性名称为integer或者fraction的string值

	dict['score']=sco1+sco2
	# 存入score值
	
	print(dict)
	# 检查dict是否为目标输出内容
	
	with open(file, 'a+', encoding='utf-8') as f: 
	# 以 a+ 方式打开目标file文件,
	# 如果该文件已存在,文件指针将会放在文件的结尾。
	# 文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
		f.write(str(dict)+'\n') 
		# 注意添加 换行符 '\n',实现每个dict自动换行写入txt中
		
print('抓取完毕') 

猫眼电影TOP100榜单中的抓取目标dd节点内容样式参考:

<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="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
      <img data-src="http://p1.meituan.net/movie/[email protected]_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">6</i></p>        
    </div>

      </div>
    </div>

                </dd>