【Python3爬虫】豆瓣《我不是药神》短评

工具:

Python3+Pycharm+Chrome

使用到的模块:

(1)requests:用来简单数据请求。(2)lxml:比BeautiSoup更快更强的解析库。(3)pandas:数据处理神器。(4)time:设置爬虫访问间隔。(5)random:生成随机数,配合time使用。(6)tqdm:显示程序运行进度。

步骤:

1、打开豆瓣电影《我不是药神》的短评网页,右键检查或者按F12,然后选择用户名和评论就会显示出对应的代码部分

2、通过requests模块发送一个get请求,并以utf-8重新编码;然后添加一个交互,判断是否成功获取到资源(状态码为200),输出获取状态。对于爬取下来《我不是药神》的短评内容,我们用lxml来进行解析。在步骤1中找到对应部分的代码,然后右键选择Copy,再选择Copy XPath,就能获取其路径了。爬取下来的短评首尾可能有多余的空格,我们就需要使用字符串中的strip()方法来去掉这些多余的空格。

获取用户名和短评的代码如下:

name=x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/text()'.format(i))
content=x.xpath('//*[@id="comments"]/div[{}]/div[2]/p/text()'.format(i))

3、获取到数据之后,我们通过list构造dictionary,然后通过dictionary构造dataframe,并通过pandas模块将数据输出为csv文件,代码如下:

infos={'name':name_list,'content':content_list}
data=pd.DataFrame(infos,columns=['name','content'])
data.to_csv("豆瓣《我不是药神》.csv")

运行截图:

这里我们爬取了十页短评的用户名和内容,借助tqdm模块就能够清晰地看到我们爬取的进度。

部分短评截图:

最终代码:

 1 # 爬取电影《我不是药神》的短评
 2 import requests
 3 from lxml import etree
 4 from tqdm import tqdm
 5 import time
 6 import random
 7 import pandas as pd
 8 
 9 name_list, content_list = [], []
10 
11 
12 def get_content(page):
13     url = "https://movie.douban.com/subject/26752088/comments?start=20&limit=20&sort=new_score&status=P&percent_type={}" \
14         .format(page * 20)
15     res = requests.get(url)
16     res.encoding = "utf-8"
17     if (res.status_code == 200):
18         print("\n第{}页短评爬取成功!".format(page + 1))
19     else:
20         print("\n第{}页爬取失败!".format(page + 1))
21 
22     x = etree.HTML(res.text)
23     for i in range(1, 21):
24         name = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/text()'.format(i))
25         content = x.xpath('//*[@id="comments"]/div[{}]/div[2]/p/text()'.format(i))
26         name_list.append(name[0])
27         content_list.append(str(content[0]).strip())
28 
29 
30 if __name__ == '__main__':
31     for i in tqdm(range(0, 10)):
32         get_content(i)
33         time.sleep(random.randrange(6, 9))
34     infos = {'name': name_list, 'content': content_list}
35     data = pd.DataFrame(infos, columns=['name', 'content'])
36     data.to_csv("豆瓣《我不是药神》.csv")

猜你喜欢

转载自www.cnblogs.com/TM0831/p/9370839.html