爬虫实例
# 引用requests库
import requests
# 引用BeautifulSoup库
from bs4 import BeautifulSoup
# 为躲避反爬机制,伪装成浏览器的请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
# 获取数据
res_foods = requests.get('http://www.xiachufang.com/explore/',headers=headers)
# 解析数据
bs_foods = BeautifulSoup(res_foods.text,'html.parser')
# 查找最小父级标签
list_foods = bs_foods.find_all('div',class_='info pure-u')
# 创建一个空列表,用于存储信息
list_all = []
for food in list_foods:
tag_a = food.find('a')
# 菜名,使用strip()函数去掉多余的空格
name = tag_a.text.strip()
# 获取URL
URL = 'http://www.xiachufang.com'+tag_a['href']
tag_p = food.find('p',class_='ing ellipsis')
# 食材,使用strip()函数去掉多余的空格
ingredients = tag_p.text.strip()
# 将菜名、URL、食材,封装为列表,添加进list_all
list_all.append([name,URL,ingredients])
# 打印
for food in list_all:
print(food)
问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果就是全部展示打印出来
接下来我们一起分析网页吧~
进入首页 https://movie.douban.com/top250?start=0&filter= ,打开检查工具,在Elements里查看这个网页,是什么结构。点击开发者工具左上角的小箭头,选中“肖申克的救赎”,这样就定位了电影名的所在位置,审查元素中显示:标签内的文本,class属性;推荐语和评分也是如此,,
- 。
我们再换个电影验证下找的规律是否正确。
check后,我们再看一共10页,每页的url有什么相关呢?
第1页:https://movie.douban.com/top250?start=0&filter=
第3页:https://movie.douban.com/top250?start=50&filter=
第7页:https://movie.douban.com/top250?start=150&filter=
发现只有start后面是有变化哒,规律就是第N页,start=(N-1)*25
基于以上分析,我们有两种写爬虫的思路。
思路一:先爬取最小共同父级标签,然后针对每一个父级标签,提取里面的序号/电影名/评分/推荐语/链接。
思路二:分别提取所有的序号/所有的电影名/所有的评分/所有的推荐语/所有的链接,然后再按顺序一一对应起来。 -
import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} list_all = [] for i in range(0,10): x=i*25 http='https://movie.douban.com/top250?start='+str(x)+'&filter= ' # print(http) res = requests.get(http, headers=headers) html = res.text list_movies = BeautifulSoup(html, 'html.parser') list_movies = list_movies.find_all('div', class_='item') for movie in list_movies: # print(movie) # print('---------------------------') number = movie.find('em').text # print(number+'%%%%%%') URL = movie.find('a')['href'] # print(URL+'%%%%%') title = movie.find('span', class_='title').text # print(title+'%%%%%%%') score = movie.find('span', class_='rating_num').text # print(score) try: recommended = movie.find('span', class_='inq').text except: recommended = '没有评论' # print(recommended) list_all.append([number, title, score, recommended, URL]) for movie in list_all: print(movie)
这里要注意的是,有的没有评论,在调试过程中出现了报错,所以做了报错处理