北笙南鸢离 发表于 2023-10-11 07:57:35

爬取豆瓣电影top250榜单信息,无法da

本帖最后由 北笙南鸢离 于 2023-10-11 07:57 编辑

import requests
# 爬取豆瓣top250的电影排行
# 这里不能发链接 我就用url指代豆瓣电影top250的榜单了
res = requests.get(url)
print(res)
# 输出 <Response >
print(res.text)
# 没有显示输出结果

# 仍然没有结果
with open('douban.txt', 'w') as f:
    f.write(res.text)

代码如上,想半天没想出来怎么回事,求教

isdkz 发表于 2023-10-11 07:57:59

这个问题的原因是因为豆瓣网站对爬虫有反爬虫机制,可能会检测到你的请求是自动化的,并返回一个错误的响应码418。为了解决这个问题,你需要模拟浏览器的行为来避免被检测到。

你可以使用Python中的Selenium库来模拟浏览器的行为。首先,你需要下载并安装浏览器驱动程序,例如ChromeDriver,并将其添加到系统环境变量中。然后,你可以按照以下步骤来爬取豆瓣电影top250榜单信息:

from selenium import webdriver

# 创建Chrome浏览器对象
browser = webdriver.Chrome()

# 打开豆瓣电影top250榜单页面
url = 'https://movie.douban.com/top250'
browser.get(url)

# 获取页面源代码
html = browser.page_source

# 关闭浏览器
browser.quit()

# 将页面源代码写入文件
with open('douban.txt', 'w', encoding='utf-8') as f:
    f.write(html)


这样就可以成功爬取豆瓣电影top250榜单信息了。

陶远航 发表于 2023-10-11 07:58:26

你的代码遇到的问题是HTTP 418错误,这是一个非标准的HTTP状态码,通常被用来表示服务器拒绝服务,因为它认为你的请求是由自动化工具(如爬虫)发出的。这是豆瓣网站为了防止爬虫而设置的反爬虫机制。

你可以尝试以下几种方法来解决这个问题:

1. 设置请求头:你可以在你的请求中添加一个\"User-Agent\"头,这样服务器就会认为你的请求是由浏览器发出的,而不是由爬虫发出的。以下是一个例子:

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\"
}
res = requests.get(url, headers=headers)


2. 使用代理:如果设置请求头还不能解决问题,你可以尝试使用代理。这样服务器就会认为你的请求是由代理服务器发出的,而不是由你的计算机发出的。以下是一个例子:

proxies = {
    \"http\": \"http://10.10.1.10:3128\",
    \"https\": \"http://10.10.1.10:1080\",
}
res = requests.get(url, headers=headers, proxies=proxies)


请注意,你需要将上述代码中的代理服务器地址和端口替换为你自己的代理服务器地址和端口。

3. 使用cookies:有些网站会要求用户登录后才能访问某些页面。在这种情况下,你可以在你的请求中添加cookies。以下是一个例子:

cookies = {\"key\": \"value\"}
res = requests.get(url, headers=headers, cookies=cookies)


请注意,你需要将上述代码中的\"key\"和\"value\"替换为你自己的cookies的键和值。

希望这些方法能帮助你解决问题。如果你还有其他问题,欢迎继续提问。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-11 07:59:45

问题分析:

根据提供的代码,发现获取豆瓣电影Top250榜单的请求返回了状态码418,这意味着请求被拒绝了。可能的原因是代码中没有设置请求头信息或者遇到了反爬机制。

解决方案:

1. 设置请求头信息:可以尝试设置User-Agent头信息,模拟浏览器发送请求。


import requests

url = 'https://movie.douban.com/top250'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}

res = requests.get(url, headers=headers)
print(res.status_code)
print(res.text)

with open('douban.txt', 'w', encoding='utf-8') as f:
    f.write(res.text)


2. 使用Cookies:如果上述方法仍然无法成功获取数据,可以尝试使用Cookies来模拟登录状态。


import requests

url = 'https://movie.douban.com/top250'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
    'Cookie': 'your_cookie_value'# 替换为有效的Cookie值
}

res = requests.get(url, headers=headers)
print(res.status_code)
print(res.text)

with open('douban.txt', 'w', encoding='utf-8') as f:
    f.write(res.text)


请注意,以上代码仅作为参考,具体的请求头信息和Cookie值需要根据实际情况进行设置。另外,建议使用encoding='utf-8'参数来指定文件编码,以免出现写入文件乱码问题。

希望能帮助到你!如有更多问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

北笙南鸢离 发表于 2023-10-11 11:08:11

谢谢各位,当时做的时候考虑到了可能是因为没加headers的原因,但因为是照着书做的就没细究...{:5_104:}
页: [1]
查看完整版本: 爬取豆瓣电影top250榜单信息,无法da