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查看需要的数据,同时观察数据特征:...
scrapy爬虫
步骤
1 进入虚拟环境
进入之前以及搭建好的虚拟环境:
2 测试爬取页面
在anaconda的shell中输入下面格式(scrapy 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
第一步 点击调试
第二步 查看内存数据是否对应
7 数据存入数据库
修改settings.py,配置Mysql数据库的信息
本文地址:https://blog.csdn.net/qq_37150711/article/details/107290847