打造自己的网站,请人做网站需要问哪些问题,二级网页制作教程,网站开发架构目录 前言
一、配置环境
1.1、 安装Python
1.2、 安装Requests库和BeautifulSoup库
1.3.、安装Matplotlib
二、登录豆瓣网#xff08;重点#xff09;
2.1、获取代理
2.2、测试代理ip是否可用
2.3、设置大量请求头随机使用
2.4、登录豆瓣网
三、爬取某一部热门电影…目录 前言
一、配置环境
1.1、 安装Python
1.2、 安装Requests库和BeautifulSoup库
1.3.、安装Matplotlib
二、登录豆瓣网重点
2.1、获取代理
2.2、测试代理ip是否可用
2.3、设置大量请求头随机使用
2.4、登录豆瓣网
三、爬取某一部热门电影数据
3.1、爬取全部长、短评论
3.2、获取用户观影数据
3.3、存入数据库
四、实战代码示例
五、总结 前言
豆瓣网是一个具有影响力的电影评论网站其中包含大量的用户评论和评分数据。这些数据可以用于研究电影市场和用户观影习惯同时还可以用于电影推荐算法以及在线视频网站的用户行为分析等方面因此对于想要学习数据分析和机器学习的人来说爬取豆瓣网电影评论数据是一个很好的练手项目。 本文将详细介绍如何使用Python爬虫抓取豆瓣网电影评论用户的观影习惯数据并进行简单的数据处理和分析。
一、配置环境
在开始爬取豆瓣网电影评论数据之前我们需要配置好Python开发环境和相关依赖库。
1.1、 安装Python
首先我们需要安装Python。建议使用Python 3.x版本。可以在官网下载并安装对应版本的Pythonhttps://www.python.org/downloads/。
1.2、 安装Requests库和BeautifulSoup库
接下来我们需要安装两个Python库Requests和BeautifulSoup。Requests库可以用于发送HTTP请求获取网页内容而BeautifulSoup库可以用于解析HTML文档提取所需数据。
可以使用pip命令自动安装这两个库
pip install requestspip install beautifulsoup4
1.3.、安装Matplotlib
如果我们需要对抓取的数据进行可视化分析可以使用Matplotlib库。可以使用pip命令安装
pip install matplotlib
安装完成后我们就可以开始爬取豆瓣网电影评论数据了。
二、登录豆瓣网重点
豆瓣网对爬虫有一定的反爬虫策略根据实战经验反爬一般作用于用户ID、用户IP和请求头的过滤为了避免被封禁IP代码中需要加入一些反爬虫措施
设置请求间隔使用代理IP伪装请求头等
2.1、获取代理 使用代理可以帮助我们隐藏自己的真实IP地址避免被封禁IP或者限制访问。在爬取豆瓣网电影评论数据时如果频繁地访问同一个IP地址豆瓣网可能会禁止我们的访问因此使用代理也可以防止被封禁。这里我使用的是站大爷代理ip来进行操作的。 以下是使用用户名密码授权获取ip代码示例 import requests#你要访问的网址
url http://www.ip138.com/
proxies {http: http://账号:密码ip:port,https: http://账号:密码ip:port
#“用户名密码”授权账号为实例ID密码为8位数字的密码不用MD5加密,在后台的实例管理下可以看到}
response requests.get(url, proxiesproxies)
2.2、测试代理ip是否可用 测试代理IP是否可用是为了确保我们使用的代理IP能够正常工作防止由于代理IP失效或无效而导致爬虫请求失败。一般来说我们可以通过发送请求来测试代理IP是否可用如果请求成功则说明代理IP可用否则说明代理IP无效或被封禁。
测试代理IP的代码可以通过如下方式实现 定义一个函数接收代理IP和目标网站URL作为参数 在函数中使用requests库发送请求并设置代理IP 如果请求成功则说明代理IP可用返回True 如果请求失败则说明代理IP无效或被封禁返回False
以下是一段测试代理IP的代码示例
import requestsdef test_proxy_ip(proxy_ip, target_url):proxies {http: http:// proxy_ip,https: http:// proxy_ip}try:response requests.get(target_url, proxiesproxies, timeout5)if response.status_code 200:return Trueelse:return Falseexcept:return False
在上述代码中我们定义了一个test_proxy_ip函数该函数接收代理IP和目标网站URL作为参数。在函数中我们首先根据传入的代理IP构造proxies字典然后使用requests库发送请求并设置proxies参数为该字典。如果请求成功则说明代理IP可用函数返回True否则函数返回False。
当我们在爬取豆瓣网电影评论数据时可以使用上述代码测试代理IP是否可用。如果代理IP可用则使用该代理IP发送请求如果代理IP无效或被封禁则需要更换新的代理IP。
2.3、设置大量请求头随机使用 爬取豆瓣网电影评论用户的观影习惯数据要设置大量请求头随机使用是为了防止网站监测到我们的请求头是模拟的并防止被反爬虫机制封禁IP。因此我们需要尽可能多的提供不同的请求头信息对请求头进行随机使用以降低被监测到的概率。
以下是一个随机使用请求头的示例代码
import randomUSER_AGENTS [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299,# 更多用户代理信息...]def get_random_user_agent():return random.choice(USER_AGENTS)headers {User-Agent: get_random_user_agent(),Referer: https://www.douban.com,Cookie: your_cookie}
在以上代码中我们定义了一个USER_AGENTS列表包含多个常用浏览器的User-Agent信息。然后定义了一个get_random_user_agent()函数用于随机从USER_AGENTS列表中获取一个User-Agent信息。最后我们设置headers变量使用get_random_user_agent()函数获取随机的User-Agent信息并将其赋值到headers变量中作为请求头信息。
需要注意的是我们在使用随机请求头的同时仍然需要保持一定的爬取速度和请求间隔以避免被封禁。同时如果服务器在返回的内容中发现请求头信息异常我们也可能被视为爬虫而被封禁。因此在进行豆瓣网电影评论用户数据爬取时需要谨慎处理请求头信息。
2.4、登录豆瓣网
以下是一个使用selenium模拟登录豆瓣网并保存cookie的示例代码
from selenium import webdriver
import time
import picklelogin_url https://accounts.douban.com/passport/login?sourcemovie
username your_username
password your_password
cookie_file cookies.pkl
# 启动浏览器
driver webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 访问登录页面
driver.get(login_url)
# 输入用户名和密码
driver.find_element_by_id(username).send_keys(username)
driver.find_element_by_id(password).send_keys(password)
# 等待用户输入验证码
time.sleep(30)
# 点击登录按钮
driver.find_element_by_class_name(account-form-field-submit ).click()
# 等待新页面加载完成
time.sleep(10)
# 保存cookie到文件
cookies driver.get_cookies()
with open(cookie_file, wb) as f:pickle.dump(cookies, f)
# 关闭浏览器
driver.quit()
在以上代码中我们首先初始化了一些变量包括登录页面的URL、豆瓣账号的用户名和密码、以及保存cookie的文件名。
然后我们启动了Chrome浏览器并通过driver.get()方法访问了豆瓣登录页面。接着我们使用selenium模拟了用户在页面上输入了用户名和密码并等待了30秒以留出时间输入验证码。
最后我们点击登录按钮等待新页面加载完成获取了cookies并将其保存到本地文件中。注意这里我们使用了pickle模块将cookies对象序列化并保存到文件中以便后续使用。
同时我们还使用了driver.quit()方法关闭了浏览器。
三、爬取某一部热门电影数据 前面我们已经把爬取豆瓣网的准备工作全部完成然后接下来就是爬取豆瓣网中某一部热门电影的各种数据了
3.1、爬取全部长、短评论
爬取热门电影的全部长短评论可以获得以下信息 用户评价通过阅读用户的评论可以了解用户对电影的评价、看法和推荐指数等信息有助于我们更好地了解电影的口碑和观众反应。 关键词提取通过分析评论文本提取关键词可以了解电影的主题、情感、人物关系等信息有助于我们深入了解电影的故事情节和风格。 数据分析通过统计评论数量、评分分布、用户画像等数据可以帮助我们更好地了解电影的市场表现和受众群体为影视公司、制片人和电影院等决策者提供有价值的数据支持。
因此爬取热门电影的全部长短评论是一项非常有价值的工作可以为我们提供大量有用的信息和数据分析基础。
以下是一个使用BeautifulSoup和requests库爬取豆瓣网某部电影全部长、短评论说明的示例代码
import requests
from bs4 import BeautifulSoup# 设置请求头
headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
}
# 豆瓣电影页面URL
url https://movie.douban.com/subject/1292052/
# 发送请求获取页面HTML
response requests.get(url, headersheaders)
html response.text
# 使用BeautifulSoup解析HTML
soup BeautifulSoup(html, html.parser)
# 查找长评和短评标签
long_comments soup.select_one(#hot-comments div div.article span)
short_comments soup.select_one(#comments div h2 span)
# 提取评论数量并输出
long_comments_count long_comments.text.replace(全部, ).replace(条, ).strip()
short_comments_count short_comments.text.replace(全部, ).replace(条, ).strip()
print(f长评{long_comments_count})
print(f短评{short_comments_count})
# 查找所有长评和短评内容
long_comments_list soup.select(#hot-comments div div.article div div.comment p)
short_comments_list soup.select(#comments div div.comment p)
# 输出每个评论的内容
for comment in long_comments_list:print(comment.text.strip())
for comment in short_comments_list:print(comment.text.strip())
在以上代码中我们首先设置了请求头指定了请求的User-Agent信息。然后我们定义了电影页面的URL并发送了GET请求获取了页面的HTML。
接着我们使用BeautifulSoup解析了页面的HTML并查找了长评和短评标签。通过提取标签文本中的评论数量信息我们可以输出电影的长、短评数量。
最后我们再次使用CSS选择器查找所有长、短评内容并通过遍历列表输出了每个评论的文本内容。
3.2、获取用户观影数据 获取用户观影数据可以帮助我们了解用户的观影喜好和习惯可以通过分析用户的观影历史和评分记录等内容得到以下信息 用户偏好根据用户观影历史和评分记录可以了解用户的观影偏好和喜好有助于我们推荐更符合用户口味的电影和影视作品 影视推荐通过分析用户的观影历史和评分记录可以为用户推荐更符合其口味的电影和影视作品提高用户体验和满意度 数据分析通过统计用户评分和观影记录可以了解影片的市场表现和受众群体为制片人、电影院和影视公司等提供有价值的数据分析支持
因此获取用户观影数据是一项非常有价值的工作。以下是获取用户观影数据的Python代码示例
import requests
import json# 登录豆瓣网
session requests.session()
url https://accounts.douban.com/j/mobile/login/basic
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,Referer: https://accounts.douban.com/passport/login,
}
data {name: your_username, # 替换为自己的用户名password: your_password, # 替换为自己的密码remember: false,
}
session.post(url, headersheaders, datadata)
# 获取用户观影数据
uid your_user_id # 替换为自己的用户ID
url https://movie.douban.com/subject_suggest?q%E7%94%B5%E5%BD%B1 # 电影页面URL
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,Referer: https://www.douban.com/,
}
response session.get(url, headersheaders)
data json.loads(response.text)
movie_id data[0][id] # 获取电影ID
url fhttps://movie.douban.com/subject/{movie_id}/ # 获取电影详情页面URL
response session.get(url, headersheaders)
url response.url comments?start0limit20statusPsortnew_score # 获取电影短评页面URL
response session.get(url, headersheaders)
data response.text
print(data) # 输出评论内容
以上代码示例中我们首先需要登录豆瓣网然后通过获取电影ID和电影详情页面URL来获取其热门评论页面的URL最后通过发送HTTP请求获取评论数据。注意需要设置请求头信息以避免请求被网站屏蔽。
3.3、存入数据库
将获取的数据存入数据库的好处 数据持久化将数据存入数据库中可以保证数据长期保存避免数据丢失的情况 数据分析将数据存入数据库后可以使用SQL等工具进行数据分析和数据挖掘得到更深入的信息和结论 数据管理将数据存入数据库后可以方便对数据进行管理、查询和更新
以下是将获取的去重后的数据存入数据库的Python代码示例
import requests
import json
import pymysql# 登录豆瓣网
session requests.session()
url https://accounts.douban.com/j/mobile/login/basic
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,Referer: https://accounts.douban.com/passport/login,
}
data {name: your_username, # 替换为自己的用户名password: your_password, # 替换为自己的密码remember: false,
}
session.post(url, headersheaders, datadata)
# 获取用户观影数据
uid your_user_id # 替换为自己的用户ID
url https://movie.douban.com/subject_suggest?q%E7%94%B5%E5%BD%B1 # 电影页面URL
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,Referer: https://www.douban.com/,
}
response session.get(url, headersheaders)
data json.loads(response.text)
movie_id data[0][id] # 获取电影ID
url fhttps://movie.douban.com/subject/{movie_id}/ # 获取电影详情页面URL
response session.get(url, headersheaders)
url response.url comments?start0limit20statusPsortnew_score # 获取电影短评页面URL
response session.get(url, headersheaders)
data response.json()
result []
for comment in data[comments]:item {id: comment[id],user_name: comment[author][name],rating: comment[rating][value],create_time: comment[created_at],content: comment[content],}result.append(item)
# 去重
result2 []
for i in result:if i not in result2:result2.append(i)
# 存入数据库
db pymysql.connect(hostlocalhost, userroot, password123456, databasetest)
cursor db.cursor()
for item in result2:sql finsert into movie_comment (id, user_name, rating, create_time, content) values ({item[id]}, {item[user_name]}, {item[rating]}, {item[create_time]}, {item[content]})cursor.execute(sql)
db.commit()
db.close()
以上代码示例中我们使用Python连接到本地MySQL数据库并将去重后的数据存入到数据库中的movie_comment表中。注意需要根据自己的数据库用户名、密码、数据库名以及数据表名进行替换。
四、实战代码示例
由于豆瓣网对爬虫有一定的反爬虫策略为了避免被封禁IP代码中需要加入一些反爬虫措施如设置请求间隔、使用代理IP、伪装请求头等。
以下是一个基于Python的爬虫示例可以爬取指定电影的所有评论用户的观影习惯数据并保存至CSV文件中
import requestsfrom bs4 import BeautifulSoupimport csvimport timefrom random import randintMOVIE_URL https://movie.douban.com/subject/xxxxxx/ # 请替换成具体电影的URL
CSV_FILE douban.csv # CSV文件名
# 设置请求头部信息包括User-Agent和Referer
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,Referer: MOVIE_URL,
}
# 设置代理IP列表用于反爬虫策略
proxies [http://xxx.xxx.xx.xx:xxxx, http://yyy.yyy.yy.yy:yyyy, ...] # 请替换成实际的代理IP
# 设置请求间隔用于反爬虫策略
WAIT_TIME 1 # 单位为秒可适当调整
# 定义函数获取指定URL的HTML内容def get_html(url):try:proxy {http: proxies[randint(0, len(proxies)-1)]} # 从代理IP列表中随机选择一个代理response requests.get(url, headersheaders, proxiesproxy)if response.status_code 200:return response.textexcept requests.exceptions.RequestException as e:print(e)return None
# 获取评论用户主页链接def get_user_link(comment_soup):try:user_tag comment_soup.find(span, class_comment-info).find(a)user_link user_tag.get(href)return user_linkexcept:return None
# 解析评论用户主页获取观影习惯数据def get_user_data(user_link):user_data {}html get_html(user_link)time.sleep(WAIT_TIME)if html:soup BeautifulSoup(html, html.parser)# 获取用户常看类型try:type_tags soup.find_all(span, class_tags-body)type_list [t.text.strip() for t in type_tags]user_data[type] ,.join(type_list)except:user_data[type] # 获取用户评分前几名的电影除当前电影外user_data[top_movies] try:movie_tags soup.find_all(div, class_info)movie_list []for tag in movie_tags:movie_name_tag tag.find(a, class_title)if movie_name_tag and movie_name_tag[href] ! MOVIE_URL: # 排除当前电影movie_list.append(movie_name_tag.text)if len(movie_list) 5: # 最多获取前5名breakuser_data[top_movies] ,.join(movie_list)except:passreturn user_data
# 主函数def main():print(开始爬取...)# 获取评论列表comments []page 0while True:page 1url MOVIE_URL comments?start str((page-1) * 20)html get_html(url)time.sleep(WAIT_TIME)if html:soup BeautifulSoup(html, html.parser)comment_tags soup.find_all(div, class_comment-item)if comment_tags:comments.extend(comment_tags)else:break # 没有更多评论else:break # 请求失败# 获取每个评论用户的观影习惯数据user_data_list []for comment in comments:user_link get_user_link(comment)if user_link:user_data get_user_data(user_link)user_data_list.append(user_data)print(已爬取 {} 个用户观影数据.format(len(user_data_list)))time.sleep(WAIT_TIME)# 将数据保存至CSV文件with open(CSV_FILE, modew, encodingutf-8, newline) as f:fieldnames [type, top_movies]writer csv.DictWriter(f, fieldnamesfieldnames)writer.writeheader()for data in user_data_list:writer.writerow(data)print(爬取完成数据已保存至 {} 文件中。.format(CSV_FILE))
if __name__ __main__:main()
需要注意的是以上代码仅供参考实际使用时需要根据具体情况进行调整。另外爬虫涉及到的法律问题和道德问题需要认真考虑不要用于非法用途或侵犯他人隐私等行为。
需要注意的几点
为了避免被豆瓣网封禁IP建议设置访问间隔时间至少为1秒豆瓣网的HTML代码变化频繁需要不断调整解析代码以适应新的HTML格式爬取用户信息可能涉及到用户隐私应严格按照相关法律法规来进行。
五、总结
爬取豆瓣网电影评论用户的观影习惯数据能够得出用户的观影时间偏好、观影类型偏好、观影评分偏好、观影影院偏好和地理位置偏好等信息。通过这些数据分析豆瓣网能够更好地为用户推荐电影和为广告主提供更精准的广告投放服务。