当前位置: 移动技术网 > IT编程>脚本编程>Shell > scrapy爬虫实战——抓取NBA吧的内容

scrapy爬虫实战——抓取NBA吧的内容

2020年07月12日  | 移动技术网IT编程  | 我要评论

步骤

1 进入虚拟环境

进入之前以及搭建好的虚拟环境:进入之前以及搭建好的虚拟环境

2 测试爬取页面

在anaconda的shell中输入下面格式(scrapy shell 要爬取的网站):
shell

3 进入开发者模式

进入贴吧页面的开发者模式(在浏览器上按F12),分析标签:
分析标签

4 剥离页面中的数据

再次进入shell查看需要的数据,同时观察数据特征:
剥离数据

5 在pycharm中码代码

scrapy框架的目录(之前创建虚拟环境自动搭建)

代码目录

nba.py源码详解

import scrapy
from urllib import parse
import re

class nbaSpider(scrapy.Spider):
    name = 'nba'
    allowed_domains = ['tieba.baidu.com']
    start_urls = ['https://tieba.baidu.com/f?kw=nba&fr=ala0&tpl=5']

    def parse(self, response):

        # 页面中帖子的url地址
        url_list = response.css('.j_th_tit::attr(href)').extract()

        # 循环遍历处理
        for url in url_list:
            print(url)

            # 下面总是可以形成一个完整的网站格式(域名 + 路径)
            yield scrapy.Request(url=parse.urljoin(response.url, url), callback=self.parse_detail)

        # 搞下一页                定位到 点击下一页 这一属性  提取出来第1个元素就是下1页
        next_url = response.css('.next.pagination-item::attr(href)').extract()[0]
        if next_url:
            yield scrapy.Request(url=parse.urljoin(response.url, next_url), callback=self.parse)

    def parse_detail(self, response):
        # 此处设置断点,查看到了第一个帖子:置顶帖,利用最后的href可以验证之

        # 拿到帖子的标题
        # 先提一下利用css提取的格式:(.class名字1.class名字2.class名字n::提取标签中的文本).从标签格式中剥离出去
        title = response.css('.core_title_txt.pull-left.text-overflow::text').extract()

        # 拿到作者的列表
        author = response.css('.p_author_name.j_user_card::text').extract()

        # 拿到帖子的内容(如果用::text会把图片给过滤掉;里面有杂质,需要进一步处理)
        contents_list = response.css('.d_post_content.j_d_post_content').extract()
        # 进步一步处理 帖子的内容,包含 图片地址,以及 前端的换行标签
        contents_list = self.get_content(contents_list)

        # 处理帖子发送的时间和帖子位于楼数(里面有杂质,需要进一步处理)
        bbs_sendtime_list, bbs_floor_list = self.get_send_time_and_floor(response)
        
        print() # 这里设置一个断点进行debug
        # pass

    def get_content(self, contents):
        contents_list = []
        for content in contents:
            reg = ";\">(.*)</div>"
            result = re.findall(reg, content)[0] # 返回值也是一个数组
            contents_list.append(result)

        return contents_list

    # 提取发帖时间和楼数的方法
    def get_send_time_and_floor(self, response): # 总体思路就是一个分析 和 提取数据的过程

        # 属性中为 该class名(post-tail-wrap)的标签 中的span标签中 的文本,其中span标签的class名又为:tail-info
        bbs_send_time_and_floor_list = response.css('.post-tail-wrap span[class=tail-info]::text').extract()

        i = 0 # 记录 bbs_send_time_and_floor_list 校表的位置,0是“来自”,1是楼数,2是发帖时间
        bbs_sendtime_list = []
        bbs_floor_list = []

        for bbs_send_time_and_floor in bbs_send_time_and_floor_list:

            # 老师先是把"来自"过滤掉了,也行!
            """
            for lz in bbs_send_time_and_floor_list:
                if lz == '来自':
                    bbs_send_time_and_floor_list.remove(lz)
            """
            # 我这里采用排除"来自"的方法是: 根据数据的特征来提取之. 上面的是老师的方法.
            if bbs_send_time_and_floor[-1] == '楼': # 这种情况存的是楼数
                bbs_floor_list.append(bbs_send_time_and_floor)

            if ':' in bbs_send_time_and_floor: # 这种情况存的是发帖时间
                bbs_sendtime_list.append(bbs_send_time_and_floor)

            i += 1

        return bbs_sendtime_list, bbs_floor_list

6 Debug

第一步 点击调试

debug

第二步 查看内存数据是否对应

查看

7 数据存入数据库

修改settings.py,配置Mysql数据库的信息

本文地址:https://blog.csdn.net/qq_37150711/article/details/107290847

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网