requests爬取猫眼电影403错误解决方法

原代码如下: 

import requests
from requests.exceptions import RequestException


def one_page_code(url):
    try:
        page = requests.get(url)
        if page.status_code == 200:
            return page.text
        print("Failed\n状态码为%d"%(page.status_code))
    except RequestException:
        print("Exception")

def main():
    url = 'http://maoyan.com'
    print(one_page_code(url))

if __name__ == '__main__':
    main()

这个代码无论是请求百度、淘宝还是豆瓣都能正常的显示出网页源代码,但是在爬取猫眼时却返回403错误

原来请求网页的过程中,忽略了很重要的一点,就是请求头

我们在浏览器检查元素中把network中的请求头复制出来,添加到请求函数中

import requests
from requests.exceptions import RequestException


def one_page_code(url):
    
<think>嗯,用户想要用Python爬取中国21世纪高票房电影前20名的完整代码。首先,我得确定可靠的数据源。常见的电影票房数据网站有猫眼、艺恩、灯塔专业版等,但有些可能有反爬机制。比如猫眼的数据相对容易获取,但需要检查是否有反爬措施,比如请求头验证或者IP限制。 接下来,用户需要的是完整的代码示例,所以得确保代码结构清晰,包含必要的部分:发送请求、解析数据、数据存储和可视化。可能需要用到requests库发送HTTP请求,BeautifulSoup或lxml解析HTML,或者直接解析JSON数据,如果网站提供的话。比如有些网站的数据是通过Ajax加载的,直接找接口可能更方便。 然后,引用部分提到的信息中,用户之前有参考爬取全球电影排名的代码,可能需要类似的思路,修改URL和解析逻辑。引用[1]提到修改中国大学排名的代码来爬取电影数据,所以可能需要调整选择器和参数。引用[4]展示了使用matplotlib和seaborn进行可视化,这部分应该包含在代码里,生成票房前10或前20的图表。 关于反爬措施,引用[4]提到了多线程或异步抓取,但针对单个请求可能不需要太复杂,不过加上User-Agent头和可能的代理设置是基础。此外,可能需要处理动态加载的内容,这时候可以考虑用selenium,但会增加复杂度,如果静态请求能获取数据就更好了。 数据存储部分,用户可能需要保存到CSV文件,方便后续分析。代码中需要处理字段如电影名称、票房、上映年份、地区、类型等,确保解析正确。例如,使用CSS选择器或正则表达式提取所需数据。 测试代码时,要确保网站结构没有变化,否则选择器可能会失效。另外,票房数据的单位需要统一,比如转换成数值类型,方便排序和可视化。 最后,注意事项部分需要提醒用户遵守网站规则,设置延迟避免被封,以及数据更新可能导致结果变化。可能还需要处理异常,比如网络错误或数据不存在的情况,但示例代码可能为了简洁省略这些,但用户在实际使用时需要考虑。</think>根据您对21世纪中国高票房电影数据的爬取需求,结合引用内容中的技术要点,我将为您提供完整的Python爬虫解决方案,包含数据清洗与可视化功能。 ### 一、完整爬虫代码实现 ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 配置请求参数 headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&#39; } def get_movie_data(): """爬取票房数据主函数""" url = &#39;https://piaofang.maoyan.com/rankings/year&#39; try: response = requests.get(url, headers=headers, timeout=10) response.encoding = &#39;utf-8&#39; soup = BeautifulSoup(response.text, &#39;html.parser&#39;) movies = [] # 解析前20条记录 for item in soup.select(&#39;.row&#39;)[1:21]: # 修改选择器以匹配最新页面结构 name = item.select_one(&#39;.title&#39;).text.strip() box_office = item.select_one(&#39;.num&#39;).text.strip() year = item.select_one(&#39;.year&#39;).text.strip() region = item.select_one(&#39;.area&#39;).text.strip() genre = item.select_one(&#39;.genre&#39;).text.strip() movies.append({ &#39;电影名称&#39;: name, &#39;票房(亿)&#39;: float(box_office.replace(&#39;亿&#39;, &#39;&#39;)), &#39;上映年份&#39;: year, &#39;地区&#39;: region, &#39;类型&#39;: genre }) return movies except Exception as e: print(f&#39;爬取失败: {str(e)}&#39;) return [] # 数据清洗与存储 def process_data(movies): df = pd.DataFrame(movies) df.sort_values(by=&#39;票房(亿)&#39;, ascending=False, inplace=True) df.to_csv(&#39;china_top20_movies.csv&#39;, index=False, encoding=&#39;utf_8_sig&#39;) return df # 可视化分析 def visualize_data(df): plt.figure(figsize=(12, 8)) sns.barplot(x=&#39;票房(亿)&#39;, y=&#39;电影名称&#39;, data=df, palette=&#39;viridis&#39;) plt.title(&#39;21世纪中国电影票房Top20&#39;, fontsize=14) plt.xlabel(&#39;票房(亿元)&#39;, fontsize=12) plt.ylabel(&#39;电影名称&#39;, fontsize=12) plt.xticks(rotation=45) plt.tight_layout() plt.savefig(&#39;top20_boxoffice.png&#39;, dpi=300) plt.show() if __name__ == &#39;__main__&#39;: movie_data = get_movie_data() if movie_data: df = process_data(movie_data) visualize_data(df) ``` ### 二、技术要点说明 1. **反爬措施处理**: - 使用标准浏览器UA头模拟正常访问[^4] - 设置超时限制防止长时间无响应 - 建议添加随机延迟(可增加`time.sleep(random.uniform(1,3))`) 2. **数据清洗流程**: ```python # 示例数据清洗扩展 df[&#39;票房(亿)&#39;] = df[&#39;票房(亿)&#39;].apply(lambda x: float(x) if isinstance(x, str) else x) df = df[df[&#39;地区&#39;].str.contains(&#39;中国&#39;)] # 确保中国地区电影 ``` 3. **可视化增强建议**: ```python # 可添加的交互式可视化(需安装plotly) import plotly.express as px fig = px.treemap(df, path=[&#39;上映年份&#39;, &#39;电影名称&#39;], values=&#39;票房(亿)&#39;, color=&#39;票房(亿)&#39;, hover_data=[&#39;类型&#39;]) fig.show() ``` ### 三、注意事项 1. 需定期检查目标网站DOM结构变化[^1] 2. 遵守robots.txt协议,建议设置1-2秒请求间隔[^4] 3. 票房数据可能包含实时更新,结果可能随时间变化[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值