1. 首页
  2. IT资讯

【Python | 杂代码】爬虫,从基础到进阶(一)

一、学习开始前需安装模块

pip install requestspip install lxmlpip install pandas

二、讲解概要

  1. 本期先带大家利用requests+xpath爬取豆瓣影评——适合0基础同学学习

    (本来昨天是骑士对勇士的,想带大家爬取腾讯体育NBA专区话题的,可是腾讯反爬也厉害,等到下一期再教大家,毕竟从基础开始,就要简单点,哈哈哈。)

2.下一期,将带大家学习如何应对反爬

三、正式开始,竖起你的小眼睛

1.requests + xpath 爬取豆瓣影评 (1)获取页面内容

# 爬取页面 urldouban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'# requests 发送请求get_response = requests.get(douban_url)# 将返回的响应码转换成文本(整个网页)get_data = get_response.text'''到这里我们就已经获取了整个网页的内容,可以‘算’是完成了爬虫'''

(2)分析页面内容,获取我们想要的内容

  • 浏览器中打开我们要爬取的页面

  • 按F12进入开发者工具,查看我们想要的数据在哪里

  • 这里我们只要 评论人+评论内

    【Python | 杂代码】爬虫,从基础到进阶(一)

  • 分析我们获取的 xpath值'/html/body/div[3]/div[1]/div/div[1]/div[4]/div[1]/div[2]/h3/span[2]/a''/html/body/div[3]/div[1]/div/div[1]/div[4]/div[2]/div[2]/h3/span[2]/a''/html/body/div[3]/div[1]/div/div[1]/div[4]/div[3]/div[2]/h3/span[2]/a'

  • 通过观察我们发现,这几个xpath只有细微不同,上面加粗的部分已数加的格式改变,所以我们要爬取所有的 commentator(评论者),只需把xpath改为:'/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a'即不要后面的序号,当我们查询时,会自动捕获类似的xpath。

  • 同样的分析,我们可以得到评论内容的xpath为:'/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p'

# (跟在上面代码后)解析页面,并输出获取内容a = etree.HTML(get_data)commentator = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()')# 解析获取内容,去除多余内容for i in range(0,len(files)): print(commentator[i]+'说:') files[i].strip(r'n') files[i].strip(' ') print(comment_content[i])

  • 运行结果(一部分数据)

Oriol Paulo说: 'Wrath of silence' is quite different from the crime movies I've seen. It's a mix of genres. It's a crime movie,a mystery movie,an action movie,it's also a social realistic movie. Xin Yu Kun plays very well the mix of different genres in this film,and it has a powerful ending.文文周说: 对于平均水准以上的年轻导演,应毫不吝啬予以鼓励,对于年龄一大把了还言之无物的导演,才要无情打击。西楼尘说: 老板儿子吃真空羊肉,贪婪绞入碎肉机;屠夫儿子喝污染井水,正义只在电视屏。戳瞎左眼,被戳伤的同乡都能包庇;咬断舌头,被救助的律师却不敢发声。凭蛮力垒不成金字塔,靠假声变不成兔子妈。超人面具如同良心咒,送不回原主;寻子告示像是招魂符,在风里飘摇。真相埋进泥土,藏入山洞,终于再无人知。#85说: 忻钰坤第二部作品不是一部秀操作的《心迷宫2.0》,要说风格像谁,都像也都不像:凝视山洞的库布里克单点透视、像科恩兄弟一样塑造的神经质杀手、《老男孩》一样的长廊Fight…不一样的是,不只是想告诉你凶手是谁,而是他的选择,以及像手术刀一样划开上层失态、中层失德、底层失语、人间失格的社会症结一口吃掉小蛋糕说: 结尾太赞,配乐非常喜欢,如果能去掉字幕就好了。从姜武拿起烟灰缸的时候就猜到了结尾。只不过细思极恐,井水为什么越来越咸?为什么那么多人都水肿?村长是知道的,不然不会喝矿泉水。然而这个梗,最后却没有过多的交代大大肉罐说: 上层伪善残暴,中层冷漠自私,下层失语无力。武侠小王子说: 当年摩托罗拉的电量还是大大不如诺基亚。劉瀟陽说: 仅仅是80%成片,已经精彩绝伦。中国类型片就该这么拍。良好的多线叙事控制力,深穴映射人性,爆炸增长的经济,暴裂难控的社会问题,男人无声的愤恨和伤痛,就像无法发声的底层人民。黑暗结尾,孩子没有寻回,真相没有昭显,这却是社会真相。有时恶人作恶,仅是为了与相同利益者变成真正的同盟。木卫二说: 不断向下,堕入黑暗的那种片子,鞭挞了社会主要矛盾,且不负责提供解谜快感,所以看完会很沉,很堵。如果《心迷宫》还是手工时代的自发创作,《暴裂无声》明显是工业时代(卡司动作特效)的考量,三人较劲,律师一角太弱,宋洋战力太强,姜武模式化。优点和缺陷都比较明显。巴伐利亞酒神说: 结局太他妈的屌了,看完在影院倒吸一口凉气。影射也很牛逼啊,1984的摩托牌照,一个底层屌丝的人设为哑巴(没有话语权),律师(代表中产和法律)和煤老板(代表权贵和黑恶势力)的相互勾结。所以即便张保民拥有《黄海》里绵正赫那样爆表的武力值,也只能沦为这个残酷社会的牺牲品。凌睿说: 当你望着深渊的时候,深渊也在望着你。frozenmoon说: 昌万年是食肉者,徐文杰是喝汤的,而张保民本人就是“肉”,原本他们在食物链的一个位置安之若素的扮演自己的角色,但意外冲垮了一切。失控之后,每个人都发现自己不过都是“肉”,昌摘下假发和西装,也得臣服于暴力和运气,徐走出金钱和言辞的保护也要面对残酷,张的代价或许更大。人性暴裂的闷响。无耻不混蛋说: 影片最打动我的,不是那些显而易见、甚至昭然若揭的隐喻,而是整部影片的“失语”。我们属于“失语的一代”,对应片中,不仅仅只是表层的哑巴张保民的“生理性失语”,更是,精英阶层律师在片尾所选择的“主动性失语”。而影片对“失语”的精准展示,不仅敏感捕捉到了时代痛点,而且极为戳痛人心。

(3)实现翻页,并把评论人和评论内容存入csv文件

  • 翻页(1)和前面分析xpath不同,我们只要找出每页之间url的不同之处和规律即可。

    # start 属性表示开始位置turn_page1 = 'https://movie.douban.com/subject/26647117/comments?status=P'turn_page2 = 'https://movie.douban.com/subject/26647117/comments?start=20&limit=20&sort=new_score&status=P'turn_page3 = 'https://movie.douban.com/subject/26647117/comments?start=40&limit=20&sort=new_score&status=P'turn_page4 = 'https://movie.douban.com/subject/26647117/comments?start=60&limit=20&sort=new_score&status=P'

    观察发现,除了第一个,每个url就只有 start的值不同,而且每次增加20,上面已经说了start属性,通过观察我们也不难发现,每个页面只有20条评论,这个是由 limit这个属性控制的(小编已经试过,人为改动是没有用的,估计是豆瓣的反爬,但并不影响我们),我这里想说明的是这个start的值之所以会以20为增量,就是这个 limit 控制的。

  • 翻页(2)

# 获取评论总数 comment_counts = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()') comment_counts = int(comment_counts[0].strip("看过()")) # 计算出总的的页面数(每页有20条评论) page_counts = int(comment_counts/20) # 请求访问,并把爬取数据存入csv文件 for i in range(0,page_counts): turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format(i*20) get_respones_data(turn_page_url)

在完成上面之前,我们肯定要把之前写的代码进行修改,让代码看起,我们可以把前面写的代码封装成一个函数get_respones_data(),传入一个访问url参数,获得返回的HTML。

代码大整改:

import requestsfrom lxml import etreeimport pandas as pddef get_respones_data(douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'): # requests 发送请求 get_response = requests.get(douban_url) # 将返回的响应码转换成文本(整个网页) get_data = get_response.text # 解析页面 a = etree.HTML(get_data) return a first_a = get_respones_data() # 翻页 comment_counts = first_a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()') comment_counts = int(comment_counts[0].strip("看过()")) page_counts = int(comment_counts / 20) #小编已经测试过了,如果没有登入的话最多只能访问10个页面,也就是200条评论 #下一期小编将教大家如何应对反爬 for i in range(0, page_counts+1): turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format( i * 20) print(turn_page_url) a = get_respones_data(turn_page_url) # 获取评论人和评论内容 commentator = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()') comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()') # 解析内容,并存入csv文件 content = [' ' for i in range(0, len(commentator))] for i in range(0, len(commentator)): comment_content[i].strip(r'n') comment_content[i].strip(' ') content_s = [commentator[i],comment_content[i]] content[i] = content_s name = ['评论人','评论内容'] file_test = pd.DataFrame(columns=name, data=content) if i == 0: file_test.to_csv(r'H:PyCodingFlaskCodingTest_alltest0609appcomment_content.cvs',encoding='utf-8',index=False) else: file_test.to_csv(r'H:PyCodingFlaskCodingTest_alltest0609appcomment_content.cvs',mode='a+',encoding='utf-8',index=False)

四、来点进阶的(和爬虫无关)

新安装模块

1pip install jieba2pip install re3pip install csv4pip install pyecharts5pip install numpy

  1. 解析数据

1 with codecs.open(r'H:PyCodingFlaskCodingTest_alltest0609appcomment_content.cvs', 'r', 'utf-8') as csvfile: 2 content = '' 3 reader = csv.reader(csvfile) 4 i =0 5 for file1 in reader: 6 if i == 0 or i ==1: 7 pass 8 else: 9 content =content + file1[1]10 i = i +111 # 去除所有评论里多余的字符12 content = re.sub('[,,。. rn]', '', content)

2.分析数据

# 切词,将整个评论分解成一个个的词语1segment = jieba.lcut(content)2words_df = pd.DataFrame({'segment': segment})3# quoting=3 表示stopwords.txt里的内容全部不引用4stopwords = pd.read_csv(r"H:PyCodingFlaskCodingTest_alltest0609appstopwords.txt", index_col=False, quoting=3, sep="t", names=['stopword'], encoding='utf-8')5words_df = words_df[~words_df.segment.isin(stopwords.stopword)]# 计算每个词语重复出现次数6words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": numpy.size})7words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)

3.数据可视化

1test = words_stat.head(1000).values# 获取所有词语2words = [test[i][0] for i in range(0,len(test))]# 获取词语对于的出现次数3counts = [test[i][1] for i in range(0,len(test))]4wordcloud = WordCloud(width=1300, height=620)# 生成词云图5wordcloud.add("爆裂无声", words, counts, word_size_range=[20, 100])6wordcloud.render()

4.显示效果

【Python | 杂代码】爬虫,从基础到进阶(一)

可以看出来,大家非常喜欢导演,哈哈哈哈~数据只爬了10页,等下一期给大家讲解反爬虫之后,爬取全部内容,就能获取更准确的数据啦。

希望大家评论支持,大二学生很迷茫。暑假将为大家整理分享大约1000多g的经典学习资源(包括:javaweb/python/html/css/js/node/vue/实用软件等)欢迎关注微信:极简XksA

【Python | 杂代码】爬虫,从基础到进阶(一)

人生真的很艰难,继续要努力!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31556503/viewspace-2215836/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:布吉卡,转转请注明出处:http://www.cxybcw.com/193417.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code