爬虫-Task01:request.get进阶:爬取豆瓣电影
以完成爬取豆瓣电影为例,进行本次学习任务的总结。
目标是爬取豆瓣电影TOP250的影片名称和海报。
https://movie.douban.com/top250
首先对网页内容进行分析。
总共250部电影,每页25部,共有10页。因此,除了爬取每页的所需内容,还需要进行跳页操作。这里先手动进行翻页,通过观察发现网址发生了变化。
简单推理并尝试之后可以知道,这10页的网址可以通过如下规律迭代获得:
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
print(url)
那么,现在只需要解决每一页的内容爬取,再套上一层循环即可。
以爬取第一页的内容为例。
url = 'https://movie.douban.com/top250?start=0&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
print(text)
即可获得该页的所有内容。
再分析其中的具体内容,可以发现,在‘alt’之后,存在影片名称和海报地址。
那么,如下操作可以获得以“肖申克的救赎”为开头的text:
text = text[text.find('alt')+3:]
text.split('"')
接着,可以提取出影片“肖申克的救赎”的名称和图片地址:
text = text.split('"')
name = text[1]
image = text[3]
print(name)
print(image)
为了方便调用,将上述名称和地址的提取方法定义成单独的函数,并对一页中的25部影片逐部操作:
def extract(text):
text = text.split('"')
name = text[1]
image = text[3]
return name, image
url = 'https://movie.douban.com/top250?start=0&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
name,image = extract(text)
item.append((name,image))
print(item)
这样便得到了第一页中25部影片的名称和图片地址。
接着,再套上一层循环,便可以得到10页共250部影片的名称和图片地址。
import requests
def extract(text):
text = text.split('"')
name = text[1]
image = text[3]
return name, image
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
name,image = extract(text)
item.append((name,image))
for item1 in item:
print(item1)
接着,再将item中的内容写入txt文档并保存海报图片。
import requests
def extract(text):
text = text.split('"')
name = text[1]
image = text[3]
return name, image
stars = 1
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
name,image = extract(text)
item.append((name,image))
for item1 in item:
with open('douban_film.txt','a',encoding='utf-8') as f:
f.write('排名:%d\t电影名:%s\n' % (stars, item1[0]))
r = requests.get(item1[1])
with open('image/' + str(item1[0]) + '.jpg', 'wb') as f:
f.write(r.content)
stars += 1
最后,可以将生成item模块和写入模块写成单独的函数。
import requests
def write_file(item, stars):
'''根据提取出的影片名称和图片地址写入txt文档并保存图片'''
print(item)
with open('douban_film.txt','a',encoding='utf-8') as f:
f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
r = requests.get(item[1])
with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
f.write(r.content)
def extract_html(url):
'''根据url提取影片名称和图片地址'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
item.append(extract(text))
return item
def extract(text):
'''根据文档提取影片名称和图片地址'''
text = text.split('"')
name = text[1]
image = text[3]
return name, image
def main():
stars = 1
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
for item in extract_html(url):
write_file(item, stars)
stars += 1
if __name__ == '__main__':
main()
到此,豆瓣电影TOP250的爬虫小任务圆满完结,撒花~