手写爬虫之糗事百科段子及神回复
先贴代码吧,然后再说遇到的坑
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/11 16:35 # @Author : yuantup # @Site : # @File : jokes_.py # @Software: PyCharm import urllib.request import re import os def open_url(url): head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/5' '37.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} req = urllib.request.Request(url, headers=head) response = urllib.request.urlopen(req) html = response.read() return html def get_content(html): text1 = html.decode('utf-8') text2 = text1.replace('\n', '') text3 = text2.replace('<br>', '\n') text = text3.replace('<br/>', '\n') pattern = '<h2>(.*?)</h2>.*?<div class="content">.*?span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i> 好笑</span>.*?<span class="cmt-name">(.*?)</span><div class="main-text">(.*?)<div class="likenum">.*?(\d*?)</div>' all_content_list = re.findall(pattern, text, re.S) print(all_content_list) for i in range(len(all_content_list)): with open('jokes_plus.txt', 'a', encoding='utf-8') as f: author = all_content_list[i][0] joker_content = all_content_list[i][1] fun_num = all_content_list[i][2] commentator = all_content_list[i][3] comment = all_content_list[i][4] dianzan_num = all_content_list[i][5] f.write('******这不是一条分界线*****\n\n') f.write(author + ':') print('1') f.write(':\n') f.write(joker_content) print('2') f.write('\n') f.write('有') f.write(fun_num) print('3') f.write('人觉得这个段子很好笑,你觉得呢?') f.write('\n') f.write('神评:') f.write('\n') f.write(commentator + ':') f.write(comment) f.write(' 点赞数:') f.write(dianzan_num) f.write('\n\n') def main(): path = 'E:\spiser_sons\jokes' a = os.getcwd() print(a) if os.path.exists(path): os.chdir(path) print(os.getcwd()) else: os.mkdir(path) os.chdir(path) for i in range(1, 21): url = 'https://www.qiushibaike.com/text/page/' + str(i) + '/' html = open_url(url) get_content(html) if __name__ == '__main__': main()
我是将爬取的代码整合到一个txt文件中,
运行结果如图:
昨天没仔细看,我代码里是计划爬取20页小段子的,现在发现从第十四页开始就和第一页重复了!!!
用浏览器进入糗事百科的网址,发现确实只有13页,当页数大于13时,自动跳转为第一页。
看来以后还是要更加仔细!
最后得到的文件及部分内容:
勉强能看,有艺术细胞的可以加工一下,hhhhh
坑一:
爬取下来的文字中夹杂这<br><br/>,使用字符串的替换方法replace(),或者用re.sub()也可以
坑二:
这是我写的正则表达式:
'<h2>(.*?)</h2>.*?<div class="content">.*?span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i> 好笑</span>.*?<span class="cmt-name">(.*?)</span><div class="main-text">(.*?)<div class="likenum">.*?(\d*?)</div>'
可以看到里面有很多小括号,这个时候我们用re.findall()得到的返回值是一个列表,每匹配一次列表就添加一个元素(元组),要理清他们的关系,搞混了就很难得到需要的内容
类似于这样的:all_content_list = [(第1组数据),(第2组数据),(第3组数据)......]
每组数据里包含6个数据,分别是
(
author, # 段子的作者名
joker_content, # 段子的内容
fun_num, # 觉得段子好笑的人数
commentator, # 神评的作者名
comment, # 神评的内容
dianzan_num # 神评点赞人数
)
它这个编辑器自动换行了我去。
坑三(未解决):
就是我写的正则表达式过长,我试着用pycharm里的灯泡解决问题,它给我换行之后就匹配不上我需要的内容了,求助各位大佬有啥好的解决办法没有!!!
灯泡是这个:
点击第一行后:
pycharm 也没有警告了,但是也匹配不到东西的,还原成一行又可以成共匹配。
我自己感觉是不是因为换行之后多出了\n,或者是表示换行的'\'没有被转义,我怎么感觉我找到答案了我去
试试去。。。。。
我还以为在=后面加个'r'就行。。。。。
失败了,不行。。。。。
求助各位大佬给个建议,谢谢