前言:
现时同学们对“使用scrapy爬取豆瓣电影”可能比较关心,大家都想要知道一些“使用scrapy爬取豆瓣电影”的相关文章。那么小编也在网摘上汇集了一些对于“使用scrapy爬取豆瓣电影””的相关内容,希望兄弟们能喜欢,咱们快快来学习一下吧!在搭建NLP模型时, 最尴尬的事情可能就是模型建好了, 发现没有可用的数据. 对于大公司,有长时间的业务积累, 数据库里保存着大量的真实数据, 所以通常不会考虑没有训练数据的问题. 但对我等普通人, 想要得到数据大概两条路: 搜索互联网上的公开数据集, 或者养一只无所不能的爬虫. 感谢Datawhale开源组织提供的Python爬虫组队学习机会, 下面进入正题, 第一次的打卡任务是爬取豆瓣电影. 因为在下对自然语言处理更感兴趣一点, 所以我给自己设定的任务是抓取一部指定电影的全部评论以及对应的评分.
使用到的Python库
主要使用到的库包括:
1) requests;
2) re;
3) BeautifulSoup4
使用requests可以完成对指定url的访问, 想更有效地使用requests库的功能, 最好对HTTP协议有一定的了解. requests库提供的get, head, post, put, delete等方法实际上对应了HTTP协议中的请求方法, 而这些requests提供的发起请求的方法又是对一个最基本的方法requests.request()的封装. 在使用某个方法向一个url发起请求时, 可以指定相应的参数, 比如设置请求头, cookies, 发送给服务端的数据, 超时, 安全验证等.
re是Python的正则表达式库, 可以用来对提取到的数据进行简单的处理.
BeautifulSoup4可以对请求的相应结果进行解析, 从中提取出你想要的数据.
关于requests和BeautifulSoup的详细使用可以参考对应的官方中文文档.
评论页面分析
首先分析电影评论页面的页面结构, 如下图所示, 这部名为"饥饿站台"的电影共有4万余条评论, 在页面底部是翻页按钮.
为了得到全部的评论数据需要分析每次翻页时URL的变化规律, 其实就是SQL的分页查询, 如下图所示, 点击"后页"时可以看到URL中的参数, 红框内是下一页数据的起始位置和每页的数据数量, 为了得到新的数据只需要改变这两个URL参数即可.
代码实现
1. 请求参数设置:
import requestsfrom bs4 import BeautifulSoupimport restart_url = ';headers = { 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'}# url参数params = { 'start': 0, 'limit': 20, 'sort': 'new_score', 'status': 'P'}text2rate = {'很差': '1\n', '较差': '2\n', '还行': '3\n', '推荐': '4\n', '力荐': '5\n'}rates_file = open('rates.txt', 'wt')contents_file = open('comments.txt', 'wt')
2. 数据保存:
def save_datas(rate_texts, contents, rates_file, contents_file): # 评论数量和评分数量必须相等才保存 if len(rate_texts) != len(contents): return # 去除评论中的换行 contents = [re.sub('\n|\r\n', '', content)+'\n' for content in contents] rates = [text2rate[text] for text in rate_texts] contents_file.writelines(contents) contents_file.flush() rates_file.writelines(rates) rates_file.flush()
3. 页面数据抓取
for idx in range(100): params['start'] = 20 * idx r = requests.get(start_url, headers=headers, params=params) soup = BeautifulSoup(r.text) comments = soup.find_all('div', class_='comment') rate_texts = [] contents = [] for comment in comments: rate_text = comment.find('span', class_=re.compile('allstar\d{2} rating')) content = comment.find('span', class_='short') if rate_text is not None and content is not None: rate_texts.append(rate_text['title']) contents.append(content.string) save_datas(rate_texts, contents, rates_file, contents_file) rates_file.close()contents_file.close()
4. 抓取结果:
待办事项如何应对网站的反爬技术如何处理网页的动态内容使用scrapy爬虫框架实现一个功能完善的爬虫
标签: #使用scrapy爬取豆瓣电影