欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2021-12-07 10:09:55
scrapy爬虫步骤1 进入虚拟环境2 测试爬取页面3 进入开发者模式4 剥离页面中的数据5 在pycharm中码代码scrapy框架的目录(之前创建虚拟环境自动搭建)nba.py源码详解步骤1 进入虚拟环境进入之前以及搭建好的虚拟环境:2 测试爬取页面在anaconda的shell中输入下面格式(scrapy shell 要爬取的网站):3 进入开发者模式进入贴吧页面的开发者模式(在浏览器上按F12),分析标签:4 剥离页面中的数据再次进入shell查看需要的数据,同时观察数据特征:...

步骤

1 进入虚拟环境

进入之前以及搭建好的虚拟环境:scrapy爬虫实战——抓取NBA吧的内容

2 测试爬取页面

在anaconda的shell中输入下面格式(scrapy shell 要爬取的网站):
scrapy爬虫实战——抓取NBA吧的内容

3 进入开发者模式

进入贴吧页面的开发者模式(在浏览器上按F12),分析标签:
scrapy爬虫实战——抓取NBA吧的内容

4 剥离页面中的数据

再次进入shell查看需要的数据,同时观察数据特征:
scrapy爬虫实战——抓取NBA吧的内容

5 在pycharm中码代码

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

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

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

第一步 点击调试

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

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

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

7 数据存入数据库

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

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