python爬取知乎live_【实战视频教程】使用scrapy爬知乎live信息

v2-a7c864b7a5b46edc105922e04e757be7.jpg【公众号:大邓python】用scrapy爬取知乎live_腾讯视频https://v.qq.com/x/cover/u0551wi70m1/u0551wi70m1.html

一、知乎Live抓包分析

打开知乎Live网址

打开浏览器开发者工具(F12)

我们直接拖动页面向下滚动,Network中就出现了很多网址和数据。 其中如下图的网址

数据与网页直播的title对应上了。说明找到了对应的网址。而且这数据还是json格式,使用起来特别方便。

网址如下

为了节约时间,今天我就只爬live标题和演讲者。

二、创建scrapy项目

打开终端命令行输入

scrapy startproject livespider [项目存放的文件夹的路径]

我在桌面上首先新建了一个scrapysqlite文件夹,然后才在终端创建livespider,项目存放于scrapysqlite文件夹中

现在我们用Pycharm打开livespider项目

现在我们看下打开后的文件目录

三、livespider项目解读

上图打开的项目目录,都是scrapy startproject livespider这个命令行回车后自动生成的。

文件或文件夹功能spiders文件夹是用来存放爬虫逻辑的文件夹items.pyspider文件夹中的爬虫脚本解析的数据,通过items.py组织数据形式pipelines.py爬虫解析出的数据,通过items封装后传递给管道,流到数据库或数据文件。pipelines实际上就是配置数据库或数据文件的settings.py整个爬虫项目的配置文件middleware.py一般不怎么用,忽略。

四、创建spider

我们要在spiders文件夹里创建一个zhihu.py 爬虫(spider)。我们可以通过点击Pycharm下方的Terminal,输入

scrapy genspider zhihu zhihu.com

生成zhihu.py文件,爬虫允许爬的域名为http://zhihu.com。

五、settings.py设置

现在我们要开始对项目进行全局配置。 打开settings.py文件,将

ROBOTSTXT_OBEY = True

改为(不遵守机器人协议,方便爬取数据)

ROBOTSTXT_OBEY = False

取消DOWNLOAD_DELAY的注释符#,并赋值为1。 此处为限制爬虫的访问网站速度。

取消DEFAULTREQUESTHEADERS的注释,并填写zhihu页面解析时的headers请求头

DEFAULT_REQUEST_HEADERS = {

'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',

'Authorization':'oauth 8274ffb553d511e6a7ffffff'

}

这里注意,经过测试发现,如果没有Authorization,只有useragent,是无法正常访问知乎网站的。所以自己查找并填写。

取消ITEM_PIPELINES的注释符#

六、items.py配置

因为今天为了省事,我们就只爬知乎Live的标题和演讲者。

items.py功能相当于爬虫解析出的数据需要一个结构化的容器封装,方便传递给pipelines使用。

形象一点的比喻就是,items将数据打包,方便运输。本项目中的zhihu.py爬虫将网站中得到的数据通过items的形式打包数据,传递给pipelines水管,并将数据流入数据库保存。

打开items.py文件,将文件修改为

from scrapy import Field,Item

class LivespiderItem(Item):

# define the fields for your item here like:

# name = scrapy.Field()

title = Field()

speaker = Field()

现在开始我们先创建好数据库,然后在配置pipelines.py Pycharm实际上可以可视化操作sqlite。

七、SQLite在PyCharm中的使用

7.1配置SQLite

步骤如下:打开pycharm,在最右侧点击Database按钮,如图中的红色数字1位置

然后依次点击2、3

2. sqlite数据库要能在Pycharm中第一次使用,需要先安装驱动。

图中底部红线指示,点击Download即可

7.2 创建sqlite数据库

选择scrapy创建好的livespider项目路径,并将数据库命名为zhihulive.db ,点击apply和ok

7.3 创建表

按照图中的123,依次点击Database 、zhihulive.db 、main

点击图中红框,先设置Table表名为LiveTable。 点击加号,依次设置了id为主键整数型自增序号。title和speaker均为TEXT格式数据

创建好数据库和表,后面我们就要在pipeline.py中操作数据。

八、pipelines.py配置

打开pipelines.py你会看到如下默认代码

import sqlite3

class LivespiderPipeline(object): def process_item(self, item, spider): pass

我们应该首先知道,pipelines是为了将数据存入数据的。爬虫启动时候,要打开数据库。

爬虫运行时候要将数据写入数据库。

爬虫结束的时候要关闭数据库。

依次对应的scrapy默认的功能函数为

def open_spider(self,spider):

pass

def process_item(self, item, spider):

#写入数据库或数据文件

return item

def close(self,spider):

#关闭数据库

pass

根据上面的知识,我们完成了下面的pipelines.py 的配置。注意format传递值的时候,前面的变量是要用 '{}'。

import sqlite3

class LivespiderPipeline(object):

def open_spider(self,spider):

#初始化爬虫,开启数据库或者新建一个csv文件

self.con = sqlite3.connect('zhihulive.db')

self.cur = self.con.cursor()

def process_item(self, item, spider):

#写入数据库或数据文件

title = item['title']

speaker = item['speaker']

sql_command = "INSERT INTO LiveTable (title,speaker) VALUES ('{title}','{speaker}')".format(title=title, speaker=speaker)

self.cur.execute(sql_command)

self.con.commit() return item

def close_spider(self,spider): #关闭数据库或者数据文件

self.con.close()

九、spider的书写

前面所有的准备都是为了这一刻,我们能够将爬到的数据存起来。现在我们开始爬虫的逻辑,也是最关键的部分。spiders文件夹下的zhihu.py

在ZhihuSpider类中,scrapy框架有默认的请求函数start_requests ,该函数对网址发起请求,yield方式返回的相应数据传递给该ZhihuSpider类中的parse函数解析。

9.1 start_requests函数

callback是回调,也就是说start_requests得到的网页数据要传输给parse函数解析。

def start_requests(self):

starturl = 'https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live'

yield Request(url=starturl, callback=self.parse)

9.2 parse函数

parse函数负责解析数据,将数据以item形式封装,并以yield方式传输给pipelines,最终写入数据库。

yield其实很像return,只不过,return后会结束函数。而yield的函数相当于生成器,返回结果后并不直接结束函数,而是保留状态,下次运行函数会按照上次的位置继续迭代下去。

from scrapy import Spider,Request

from livespider.items import LivespiderItem

import json

class ZhihuSpider(Spider):

name = 'zhihu'

allowed_domains = ['zhihu.com']

start_urls = ['http://zhihu.com/']

def start_requests(self):

starturl = 'https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live'

yield Request(url=starturl, callback=self.parse)

def parse(self, response):

item = LivespiderItem()

result = json.loads(response.text)

records = result['data']

for record in records:

item['title'] = record['live']['subject']

item['speaker'] = record['live']['speaker']['member']['name']

#将item传给pipelines.py保存到数据库

yield item

next_page_url = result['paging']['next']+'&includes=live'

yield Request(url=next_page_url, callback=self.parse)

全部写好了。现在在Pycharm终端Terminal中输入

scrapy crawl zhihu

开始愉悦的爬数据,而且还能用Pycharm看到数据库中的数据

这部分写的很粗糙,不懂的可以反复看我的视频。

项目代码在这期公众号的文章末尾

公众号:大邓带你玩Python

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
需要使用Python编程语言来爬取知乎问题下的所有回答。具体步骤如下: 1. 首先需要安装Python的requests和beautifulsoup4库,用于发送HTTP请求和解析HTML页面。 2. 获取知乎问题页面的URL,可以手动复制粘贴,或者使用虫自动获取。 3. 使用requests库发送GET请求,获取知乎问题页面的HTML源代码。 4. 使用beautifulsoup4库解析HTML源代码,获取所有回答的信息。 5. 对每个回答进行解析,获取回答的文本、作者、点赞数、评论数等信息。 6. 将获取到的信息存储到本地文件或数据库中。 下面是一段示例代码,可以爬取知乎某个问题下的所有回答: ```python import requests from bs4 import BeautifulSoup # 知乎问题页面的URL url = 'https://www.zhihu.com/question/xxxxxx' # 发送GET请求,获取页面HTML源代码 response = requests.get(url) html = response.text # 解析HTML页面,获取所有回答的信息 soup = BeautifulSoup(html, 'html.parser') answers = soup.find_all('div', class_='List-item') # 遍历每个回答,解析并存储信息 for answer in answers: # 解析回答文本、作者、点赞数、评论数等信息 text = answer.find('div', class_='RichContent-inner').get_text() author = answer.find('div', class_='ContentItem-head').get_text() upvotes = answer.find('button', class_='Button VoteButton VoteButton--up').get_text() comments = answer.find('button', class_='Button ContentItem-action Button--plain Button--withIcon Button--hoverCard').get_text() # 将信息存储到本地文件或数据库中 with open('answers.txt', 'a', encoding='utf-8') as f: f.write(f'{author}\n{text}\n赞同数:{upvotes} 评论数:{comments}\n\n') ``` 需要注意的是,爬取知乎数据属于个人行为,需要遵守知乎的相关规定,不得用于商业用途。另外,爬取速度也需要适当控制,避免给服务器造成过大的负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值