以下是一个随机使用请求头的示例代码:
import random
USER_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 pickle
login_url = 'https://accounts.douban.com/passport/login?source=movie'
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, headers=headers)
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, headers=headers, data=data)
# 获取用户观影数据
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, headers=headers)
data = json.loads(response.text)
movie_id = data[0]['id'] # 获取电影ID
url = f'https://movie.douban.com/subject/{movie_id}/' # 获取电影详情页面URL
response = session.get(url, headers=headers)
url = response.url + 'comments?start=0&limit=20&status=P&sort=new_score' # 获取电影短评页面URL
response = session.get(url, headers=headers)
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, headers=headers, data=data)
# 获取用户观影数据
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, headers=headers)
data = json.loads(response.text)
movie_id = data[0]['id'] # 获取电影ID
url = f'https://movie.douban.com/subject/{movie_id}/' # 获取电影详情页面URL
response = session.get(url, headers=headers)
url = response.url + 'comments?start=0&limit=20&status=P&sort=new_score' # 获取电影短评页面URL
response = session.get(url, headers=headers)
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(host='localhost', user='root', password='123456', database='test')
cursor = db.cursor()
for item in result2:
sql = f"insert 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 randint
MOVIE_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, headers=headers, proxies=proxy)
if response.status_code == 200:
return response.text
except 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_link
except:
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名
break
user_data['top_movies'] = ','.join(movie_list)
except:
pass
return user_data
# 主函数def main():
print('开始爬取...')
# 获取评论列表
comments = []
page = 0
while True:
page += 1
url = 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, mode='w', encoding='utf-8', newline='') as f:
fieldnames = ['type', 'top_movies']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for data in user_data_list:
writer.writerow(data)
print('爬取完成,数据已保存至 {} 文件中。'.format(CSV_FILE))
if __name__ == '__main__':
main()
需要注意的是,以上代码仅供参考,实际使用时需要根据具体情况进行调整。另外,爬虫涉及到的法律问题和道德问题需要认真考虑,不要用于非法用途或侵犯他人隐私等行为。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
![img](https://i-blog.csdnimg.cn/blog_migrate/aba1da643360e9bfeb5c1416a00c6758.jpeg)