Loading

爬虫从入门到放弃(二)

🆗来到第二篇爬虫入坑文章,寻思着第二篇应该放哪一个项目上来比较好,经过考虑,把一个较为简单的放上来了。

直接进入正题,介绍这次项目-任意贴吧的爬虫🐛

要求:

  • 可以指定贴吧名称, 起始页与结束页
  • 爬取帖子标题、摘要、贴主(楼主)、帖子回复数、最后评论人
  • 只能用requests、re实现

看过上一篇爬虫系列文章的同学应该清楚大致的爬虫流程了,我们再来回顾一哈

  1. 从url中提取响应内容
  2. 分析响应内容(页面),提取url,添加至urllist
  3. 从urllist中提取响应内容,提取数据
  4. 数据入库

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编码之后的,编码前就是爬虫

Xnip2019-09-18_20-08-32

先把第一页给爬下来瞧一瞧

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

Xnip2019-09-18_20-19-50

发现pn这个参数从0(第一页)变成了50(第二页),那是不是页码数+1,pn值就+50呢?可以做大胆推测哈,毕竟规律都是要自己找的嘛。

我们来点开第三页,第四页,第五页都看看url上PN的值

Xnip2019-09-18_20-23-13

发现确实验证了我的想法,那么我们可以开始撸代码了

由于我撸了个合并了第三个步骤的代码,所以这边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()方法不懂得旁友可以百度,是格式化输出的方法
    • 至于列表推导式的话这边就不再多述,百度的比我会说得清楚🧐

你们可以试试用自己的想法去实现,不一定要按照这个步骤来,这个步骤只是提供给没有思路的同学使用滴🤒

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

🙈运行代码试试

Xnip2019-09-18_20-53-28

其实这里面有两个小问题,不知道有没有心细的同学发现🙊,发现的同学可以在文章下方评论指出噢

4.数据入库

  • 那么我们可以直接走第四步数据入库啦,还记得mysql入库五大步骤吗?
    • 连接数据库
    • 获取游标
    • 执行sql
    • 提交事务
    • 关闭游标、关闭连接
posted @ 2019-08-29 10:00  x1you  阅读(239)  评论(0编辑  收藏  举报