关于请求头headers:
值得注意的是,与上一篇 :【python爬虫实战】爬取书店网站的 书名&价格(注释详解)-CSDN博客
爬取书名不同,这次爬取豆瓣网站必须使用“请求头headers”,不然将没有输出结果。至于说背后原因,笔者推测是豆瓣网站有“反爬虫”机制,而指定headers,可以模拟普通的人为浏览器访问 ,从而避开阻拦
//ps:每个人的headers应该不同,至于说如何获得自己的headers,可以参考b站视频,这里不再赘述~
关于从多个不同页面爬取:
观察豆瓣网站可以发现,每个页面只展示了25个,top250分布在不同的10个页面中,要在一个程序中访问十个页面,需要获得十个对应的不同的网址
而观察不同网址不难发现,它们大体上是相同的,只有部分数字呈现规律性的变化,由此,则采用如下方式更新网址:
list_ = [i for i in range(0, 226) if i%25 == 0]#获取0,25,50...for start_num in list_:# 发送请求并获取响应内容 response = requests.get(f"https://movie.douban.com/top250?start={start_num}&filter=", headers=headers)
完整代码见下:
#! usr/bin/env python
from bs4 import BeautifulSoup
import requests if __name__ == '__main__':# 设置请求头,模拟浏览器访问:因为豆瓣的网站应该是有反爬虫机制,所以必须指定headers,来模拟普通的人为浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } #headers 要用字典的方式来写try: list_ = [i for i in range(0, 226) if i%25 == 0]i = 1for start_num in list_:# 发送请求并获取响应内容 response = requests.get(f"https://movie.douban.com/top250?start={start_num}&filter=", headers=headers) response.raise_for_status() # 如果请求失败,抛出异常 soup = BeautifulSoup(response.text, "html.parser") titles = soup.find_all("span", attrs={"class": "title"}) for title in titles: #外文原名中会含有'/', 利用if语句排除之,从而只留下中文名if '/' not in title.string:print(i, '.', title.string) i += 1 except requests.RequestException as e: print(f"发生网络错误:{e}")
在vs code中运行,可实现如下输出:
~ 希望对你有帮助 ~