最近在学习python爬虫,看到了崔大神的博客,由于他使用的python2.x,于是自己就想用python3实现一下,练练手。有哪些可以改进的地方,望指正。谢谢!
本篇目标
1.抓取糗事百科中24小时栏目的段子
2.过滤有图片的段子(毕竟在终端中显示图片不太现实)
3.实现显示段子的发布者、段子内容、好笑值和评论数
分析站点并抓取页面代码
1.页面的url是https://www.qiushibaike.com/hot/page/1/,其中数字1代表的是页码,通过站点分析,24小时栏目下的页面总共有13页,所以爬取是就直接在1-13页中,无需单独获取最大的页码数(其实主要是因为懒,能省一步是一步:happy:)
2.经测试该网站没有反爬虫措施,所以可以肆无忌惮的爬,连请求头都不用加,开不开心。
代码奉上:
import requests
from requests.exceptions import RequestException
def get_page(page):
'''获取网页源代码'''
try:
url = "https://www.qiushibaike.com/hot/page/" + str(page)
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
def main(page):
'''主函数'''
html = get_page(page)
if html:
print(html)
else:
print('请求网页失败!')
if __name__ == '__main__':
'''程序入口'''
map(main, [i for i in range(1,14)])
抓取某页中所以的段子
获取页面的HTML代码后,就需要分析该页面具体每个段子的结构了,先上图:
经分析,可知:
1.每个<div class="article block untagged……"
标签都包含一个段子,结构很清晰
2.发布者在<h2></h2>
标签中,段子内容在<div class="content">
下的<span>
标签中,好笑值和评论数在上图中都标明了位置(请自行查看)
3.带图片对待段子在 标签下多一个
<div>
标签,如下:
代码奉上:
pattern = re.compile(
'<div.*?article block.*?<h2>(.*?)</h2>.*?content.*?<span>(.*?)</span>.*?' +
'<!--.*?或gif.*?>(.*?)<div class="stats".*?<span.*?number">(\d+)</i>.*?' +
'</span>.*?<a.*?>.*?number">(\d+)</i>.*?</div>',re.S)
items = re.findall(pattern, html)
for item in items:
if not item[2].split():
print(item[0], item[1], "好笑值:" + item[3], "评论数:" + item[4])
代码说明:
1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。
2)(.*?)表示一个分组,就是我们需要匹配的内容。
3)re.S表示点(.)可以匹配换行符
4)没有图片的段子,item[2] 匹配的内容为几个换行符,所以可以用split()
方法去除换行符,再加 if 判断过滤有图片的段子
输出结果:
总结
1.整个项目比较简单,主要就是正则匹配部分
2.由于能力有限,所以没办法做到和崔大神的一样回车一下显示一个段子
3.本来想再用BeautifulSoup实现下的,后来发现比较麻烦就中断了,还不如正则简单
完整代码和输出文件请访问:https://github.com/xieys 欢迎Follow和star