request.get进阶:爬取豆瓣Top250
- 浏览网页:https://movie.douban.com/top250
- 可以看出每一页仅有25个电影,共10页
- 每页URL的模式为:“https://movie.douban.com/top250?start=k&filter=” (k=0,25,50…225)
def URL_all():
urls = []
for i in range(0,250,25):
url = 'https://movie.douban.com/top250?start=' + str(i) + '&filter='
urls.append(url)
return urls
- 先任意爬一个看看:
import requests
r1 = requests.get('https://movie.douban.com/top250?start=50&filter=')
print(r1.status_code)
看到返回了418:418的意思是被网站的反爬程序返回的
解决办法:添加了header的User-Agent信息,User-Agent告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'}
r2 = requests.get('https://movie.douban.com/top250?start=50&filter=', headers=headers)
print(r2.status_code)
text = r2.text
第二次返回200,爬取成功
- F12进入开发者工具,通过Ctrl+Shift+C来查看网页各元素对应的HTML位置,发现可以用图片img的名称来找到电影名称
(此处仅演示一个网页的爬取)
from bs4 import BeautifulSoup
import re
## 用BeautifulSoup初步整理HTML格式
soup = BeautifulSoup(text, 'html.parser')
## 搜索所有有‘img’的地方
## 如:<img alt="教父2" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2194138787.jpg" width="100"/>
text = soup.find_all('img')
## 用正则表达式匹配中文字符
r = re.compile('[\u4e00-\u9fa5]')
label_list = [str(i) for i in lis]
ans = [''.join(r.findall(i)) for i in label_list]
输出如下:
['教父',
'指环王双塔奇兵',
'狮子王',
'窃听风暴',
'大闹天宫',
'指环王魔戒再现',
'两杆大烟枪',
'美丽心灵',
'饮食男女',
'飞越疯人院',
'猫鼠游戏',
'黑客帝国',
'钢琴家',
'字仇杀队',
'本杰明巴顿奇事',
'看不见的客人',
'让子弹飞',
'西西里的美丽传说',
'小鞋子',
'海豚湾',
'拯救大兵瑞恩',
'情书',
'穿条纹睡衣的男孩',
'音乐之声',
'美国往事']