爬虫从入门到放弃(二)
🆗来到第二篇爬虫入坑文章,寻思着第二篇应该放哪一个项目上来比较好,经过考虑,把一个较为简单的放上来了。
直接进入正题,介绍这次项目-任意贴吧的爬虫🐛
要求:
- 可以指定贴吧名称, 起始页与结束页
- 爬取帖子标题、摘要、贴主(楼主)、帖子回复数、最后评论人
- 只能用requests、re实现
看过上一篇爬虫系列文章的同学应该清楚大致的爬虫流程了,我们再来回顾一哈
- 从url中提取响应内容
- 分析响应内容(页面),提取url,添加至urllist
- 从urllist中提取响应内容,提取数据
- 数据入库
1.从url中提取响应内容
我们先来随便挑一个贴吧,既然我们主题是爬虫,那就打开爬虫吧瞧一瞧吧
上链接:https://tieba.baidu.com/f?kw=%E7%88%AC%E8%99%AB&ie=utf-8&pn=0
%E7%88%AC%E8%99%AB
这一块其实是经过了url编码之后的,编码前就是爬虫
先把第一页给爬下来瞧一瞧
import requests
import re
url = https://tieba.baidu.com/f?kw=%E7%88%AC%E8%99%AB&ie=utf-8&pn=0
content = requests.get(url).content.decode('utf-8')
print(content)
拿到了第一页的内容之后,发现我们要的数据都在content
中,也就是说这里不是js加载的,那么后面的事情就简单了🙄
2.分析响应内容(页面),提取url,添加至urllist
既然要满足上面的需求,那么我们要分析一下页码数的变化与url之间的关系
点击第二页看看url
发现pn
这个参数从0(第一页)变成了50(第二页),那是不是页码数+1,pn值就+50呢?可以做大胆推测哈,毕竟规律都是要自己找的嘛。
我们来点开第三页,第四页,第五页都看看url上PN
的值
发现确实验证了我的想法,那么我们可以开始撸代码了
由于我撸了个合并了第三个步骤的代码,所以这边urllist我代码是省略掉了,这边提供个想看构建urllist的代码给旁友们
- 可以使用列表推导式简化代码,构建出urllist
return [self.basic_url.format(self.name, (i-1)*50) for i in range(self.start, self.end+1)]
- 这里的basic_url就是这个
base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"
str.format()
方法不懂得旁友可以百度,是格式化输出的方法- 至于列表推导式的话这边就不再多述,百度的比我会说得清楚🧐
- 这里的basic_url就是这个
你们可以试试用自己的想法去实现,不一定要按照这个步骤来,这个步骤只是提供给没有思路的同学使用滴🤒
3.从urllist中提取响应内容,提取数据
上代码
import requests
import re
class Tieba_spider(object):
#初始化url
base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"
def get_content(self,url):
content = requests.get(url).content.decode('utf-8')
return content
def get_data(self,content):
reply = re.findall(r'title="回复">(\d+?)</span>', content) # 帖子回复数
title = re.findall(r'class="j_th_tit ">(.*?)</a>', content) # 帖子标题
abstract = re.findall(r'<div class="threadlist_abs threadlist_abs_onlyline ">([\s\S]*?)</div>', content) # 帖子摘要
owner = re.findall(r'title="主题作者:(.*?)"', content) # 帖主
last = re.findall(r'title="最后回复人:(.*?)">', content) # 最后回复人
print(reply,'\n',title,'\n',abstract,'\n',owner,'\n',last)
if __name__ == '__main__':
#输入要爬取的贴吧名称与起始页
tieba_name, start_page, end_page = input("请输入要爬取的贴吧名称"), input("请输入要爬取起始页数"), input("请输入要爬取结束页数")
s = Tieba_spider()
for i in range(int(start_page),int(end_page)+1):
url = s.base_url.format(tieba_name,50*(i-1))
print("此时爬取的url为:%s" % url)
content = s.get_content(url)
# 从url中提取响应内容
s.get_data(content)
# 数据入库
pass
🙈运行代码试试
其实这里面有两个小问题,不知道有没有心细的同学发现🙊,发现的同学可以在文章下方评论指出噢
4.数据入库
- 那么我们可以直接走第四步数据入库啦,还记得mysql入库五大步骤吗?
- 连接数据库
- 获取游标
- 执行sql
- 提交事务
- 关闭游标、关闭连接