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

scrapy爬虫

  • 步骤
  • 1 进入虚拟环境
  • 2 测试爬取页面
  • 3 进入开发者模式
  • 4 剥离页面中的数据
  • 5 在pycharm中码代码
    • scrapy框架的目录(之前创建虚拟环境自动搭建)
    • nba.py源码详解
  • 6 Debug
    • 第一步 点击调试
    • 第二步 查看内存数据是否对应
  • 7 数据存入数据库
    • 修改settings.py,配置Mysql数据库的信息

步骤

1 进入虚拟环境

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

2 测试爬取页面

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

3 进入开发者模式

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

4 剥离页面中的数据

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

5 在pycharm中码代码

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

scrapy爬虫实战——抓取NBA吧的内容_第2张图片

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 = ";\">(.*)
" 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吧的内容_第3张图片

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

scrapy爬虫实战——抓取NBA吧的内容_第4张图片

7 数据存入数据库

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

你可能感兴趣的:(NLP)