遍历list的索引和值
list1 = ['我','爱','中国']
for i,k in enumerate(list1):
print(i)
print(k)
复制代码
面向对象风格的代码, 已写注释
import requests
import time
from bs4 import BeautifulSoup
class Spider():
def __init__(self, base_url):
'''
根据入口url来实例化movie对象
'''
self.movie = Movie(base_url)
def start(self):
'''
1. 获取每个分页的url
2. 遍历, 把每个分页url作为入口
3. 进入页面, 爬取数据
4. 保存到movies_250_list
5. 处理movies_250_list, 生成markdown
'''
for movie_url in self.get_page_urls():
self.make_movie_list(movie_url)
self.movie.make_markdown()
def make_movie_list(self, url):
'''
从页面获取电影的相关信息, 保存到movie_250_list
'''
res = requests.get(url)
print(url) # 打印url, 显示进度
time.sleep(2) # 暂停2秒, 防止频率过高, 被封IP
movie_html_tag_obj = BeautifulSoup(res.text, 'html.parser')
for i in movie_html_tag_obj.find('ol', class_='grid_view').find_all('div', class_='item'):
tmp_dict = {} # 设置对象, 用来保存电影的名称, 封面, 评论, 和评分(电影的排名可以参考list的索引)
tmp_dict['movie_title'] = i.find(
'div', class_='pic').find('img')['alt']
tmp_dict['movie_img'] = i.find(
'div', class_='pic').find('img')['src']
tmp_dict['movie_desc'] = i.find('span', class_='inq').text
tmp_dict['movie_score'] = i.find('span', class_='rating_num').text
self.movie.movies_250_list.append(tmp_dict)
def get_page_urls(self):
'''
获取分页的url
因为豆瓣250电影太多, 所以进行了分页, 我们需要进入每个分页里面, 进行爬取
'''
movie_url_list = [self.movie.base_url] # 声明变量的时候, 先把第一个网址写进去
res = requests.get(self.movie.base_url)
movie_index_tag_obj = BeautifulSoup(res.text, 'html.parser')
a_tag_list = movie_index_tag_obj.find('div', class_='paginator').find_all('a') # 从a标签的href获取url
for i in a_tag_list[:9]:
movie_url_list.append(self.movie.base_url+i['href'])
return movie_url_list
class Movie():
base_url = '' # 入口url
movies_250_list = [] # 电影250列表
def __init__(self, base_url):
'''
初始化对象时, 存储url, 方便以后调用
'''
self.base_url = base_url
def make_markdown(self):
'''
创建markdown, 把之前存储的信息, 写入markdown
'''
with open('douban250.md', 'w', encoding='utf8') as file:
for index, movie_dict in enumerate(self.movies_250_list):
file.write('![]({})\n'.format(movie_dict['movie_img']))
file.write('## {}\n'.format(movie_dict['movie_title']))
file.write(
'### {} [top{}-{}]\n'.format(movie_dict['movie_desc'], index+1, movie_dict['movie_score']))
file.write('---\n\n')
if __name__ == "__main__":
spider = Spider('https://movie.douban.com/top250') # 初始化爬虫, 传入入口url
spider.start() # 开始爬取
复制代码
快速跳转:
猫哥教你写爬虫 000--开篇.md
猫哥教你写爬虫 001--print()函数和变量.md
猫哥教你写爬虫 002--作业-打印皮卡丘.md
猫哥教你写爬虫 003--数据类型转换.md
猫哥教你写爬虫 004--数据类型转换-小练习.md
猫哥教你写爬虫 005--数据类型转换-小作业.md
猫哥教你写爬虫 006--条件判断和条件嵌套.md
猫哥教你写爬虫 007--条件判断和条件嵌套-小作业.md
猫哥教你写爬虫 008--input()函数.md
猫哥教你写爬虫 009--input()函数-人工智能小爱同学.md
猫哥教你写爬虫 010--列表,字典,循环.md
猫哥教你写爬虫 011--列表,字典,循环-小作业.md
猫哥教你写爬虫 012--布尔值和四种语句.md
猫哥教你写爬虫 013--布尔值和四种语句-小作业.md
猫哥教你写爬虫 014--pk小游戏.md
猫哥教你写爬虫 015--pk小游戏(全新改版).md
猫哥教你写爬虫 016--函数.md
猫哥教你写爬虫 017--函数-小作业.md
猫哥教你写爬虫 018--debug.md
猫哥教你写爬虫 019--debug-作业.md
猫哥教你写爬虫 020--类与对象(上).md
猫哥教你写爬虫 021--类与对象(上)-作业.md
猫哥教你写爬虫 022--类与对象(下).md
猫哥教你写爬虫 023--类与对象(下)-作业.md
猫哥教你写爬虫 024--编码&&解码.md
猫哥教你写爬虫 025--编码&&解码-小作业.md
猫哥教你写爬虫 026--模块.md
猫哥教你写爬虫 027--模块介绍.md
猫哥教你写爬虫 028--模块介绍-小作业-广告牌.md
猫哥教你写爬虫 029--爬虫初探-requests.md
猫哥教你写爬虫 030--爬虫初探-requests-作业.md
猫哥教你写爬虫 031--爬虫基础-html.md
猫哥教你写爬虫 032--爬虫初体验-BeautifulSoup.md
猫哥教你写爬虫 033--爬虫初体验-BeautifulSoup-作业.md
猫哥教你写爬虫 034--爬虫-BeautifulSoup实践.md
猫哥教你写爬虫 035--爬虫-BeautifulSoup实践-作业-电影top250.md
猫哥教你写爬虫 036--爬虫-BeautifulSoup实践-作业-电影top250-作业解析.md
猫哥教你写爬虫 037--爬虫-宝宝要听歌.md
猫哥教你写爬虫 038--带参数请求.md
猫哥教你写爬虫 039--存储数据.md
猫哥教你写爬虫 040--存储数据-作业.md
猫哥教你写爬虫 041--模拟登录-cookie.md
猫哥教你写爬虫 042--session的用法.md
猫哥教你写爬虫 043--模拟浏览器.md
猫哥教你写爬虫 044--模拟浏览器-作业.md
猫哥教你写爬虫 045--协程.md
猫哥教你写爬虫 046--协程-实践-吃什么不会胖.md
猫哥教你写爬虫 047--scrapy框架.md
猫哥教你写爬虫 048--爬虫和反爬虫.md
猫哥教你写爬虫 049--完结撒花.md