scrapy框架,腾讯新闻爬取


**本篇文章应用软件:Navicat Premium 15,MySQL,pycharm

注:这里直接将爬取到的数据进行存储数据库的操作,所以在newsqq下自行创建了mysql包将items与pipelines写入在其中如下图
在这里插入图片描述

创建工程命名newsqq

可在pycharm下终端进行
在这里插入图片描述

1.1使用命令创建 scrapy 工程

scrapy startproject newsqq
cd 进入newsqq里面

1.2新建爬虫主文件

scrapy genspider news qq.com

在 spiders/目录下新建news.py主要开始进行页面的解析;
(1)导入爬虫运行所需的包

import json
from scrapy import Request
from scrapy import Spider
from newsqq.mysql.NewsmysqlItem import NewsmysqlItem

(2)修改起始url

class NewsSpider(Spider):
    name = 'news'
    allowed_domains = ['qq.com']
    start_urls = ['https://i.news.qq.com/trpc.qqnews_web.kv_srv.kv_srv_http_proxy/list?sub_srv_id=milite&srv_id=pc&offset=0&limit=20&strategy=1&ext={%22pool%22:[%22top%22],%22is_filter%22:10,%22check_type%22:true}']

注意:先按F12,点击网络标签,找到搜索按钮在搜索框输入你想要得到的字段,进行搜索发现内容是以json格式写入,则需得到json格式的url,点击消息头得到所需要的url
图一:
在这里插入图片描述图二:
在这里插入图片描述

(3)重写 scrapy 内部函数 def parse(self, response):获取起始url返回的 response 对象,提取返回的 json 数据,进行主页的title遍历,解析出来的 json 数据传递到 item 对象。 提取的字段有title,构建出新的url,传递到下一函数。

    def parse(self, response):
        result = json.loads(response.text)['data']['list']
        for data in result:
            title = data['title']
            print(title)
            url = data['url']

            item = NewsmysqlItem()
            item['title'] = title
            yield Request(url=url,callback=self.parse_detail,meta={'item':item})

注意:这里因为动态新闻以json格式编写所以我们当前所发起的url响应为json格式标签页,然后根据内容所存放标签进行爬取。
**使用 Request()方法,进行 post 请求 url,其中参数 callback 表示请求 url 之后执行的下一个方法函数,meta字典进行当前title内容存储传递给下一函数保存。
(4)自定义函数def parse_detail(self,response);获取上一函数返回的 response 对象,获取meta字典所传递数据。

    def parse_detail(self, response):
        content = response.xpath('/html/body/div[3]/div[1]/div[1]/div//text()').extract()
        content = ''.join(content)
        item = response.meta['item']
        item['content'] = content

        yield item

解析:通过response发起响应使用xpath选择器找到对应文章内容进行获取
**正则,xpath,css的使用方法:正则表达式,xpath,css的讲解
‘’.join(content)表示重写字符串,最后将item回调给管道进行数据库存储。

1.2.1爬虫完整代码
import json
from scrapy import Request
from scrapy import Spider
from newsqq.mysql.NewsmysqlItem import NewsmysqlItem
class NewsSpider(Spider):
    name = 'news'
    allowed_domains = ['qq.com']
    start_urls = ['https://i.news.qq.com/trpc.qqnews_web.kv_srv.kv_srv_http_proxy/list?sub_srv_id=milite&srv_id=pc&offset=0&limit=20&strategy=1&ext={%22pool%22:[%22top%22],%22is_filter%22:10,%22check_type%22:true}']


    def parse(self, response):
        result = json.loads(response.text)['data']['list']
        for data in result:
            title = data['title']
            print(title)
            url = data['url']

            item = NewsmysqlItem()
            item['title'] = title
            yield Request(url=url,callback=self.parse_detail,meta={'item':item})
    def parse_detail(self, response):
        content = response.xpath('/html/body/div[3]/div[1]/div[1]/div//text()').extract()
        content = ''.join(content)
        item = response.meta['item']
        item['content'] = content

		yield item

1.3 修改项目 item.py 文件

将爬虫提取的结构化数据映射到对象中

import scrapy
class NewsmysqlItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()

1.4修改项目 pipeline.py 文件

注意:当前在mysql下进行存储。
首先需要在mysql数据库内创建news数据库,创建好对应字段的表格。并且连接数据库。并将进入数据库所需要的地址用户及密码等写入管道,最终实现数据的存储。

import pymysql

class MySQLPipeline:
    def __init__(self):
        self.connect =pymysql.connect(
            host='127.0.0.1',
            port=3306,
            db='news',
            user='root',
            password='root',
            charset='utf8',
            use_unicode=True
        )
        self.cursor = self.connect.cursor()
    def process_item(self, item, spider):
        self.cursor.execute(
            """insert into newsqq(title,content)
            value(%s,%s)""",
            (item['title'],
             item['content']
            ))
        self.connect.commit()
        return item

1.5修改项目 settings.py 文件

激活 scrapy 的 pipeline 功能,禁用 ROBOT 规则,加入请求头,如果不想看日志还可将日志文件关闭。

BOT_NAME = 'newsqq'

SPIDER_MODULES = ['newsqq.spiders']
NEWSPIDER_MODULE = 'newsqq.spiders'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

LOG_LEVEL = 'WARNING'
ITEM_PIPELINES = {
   'newsqq.mysql.MySQLPipeline.MySQLPipeline': 300,
}

1.6查看结果

新建一个main.py,写入爬虫运行环境。
在这里插入图片描述

from scrapy.cmdline import execute
import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)));

execute(["scrapy","crawl","news"])

最后在main中点击run运行爬虫,查看数据库是否有数据导入。

除此之外爬虫运行命令为:

正常运行在终端:scrapy crawl news
将爬虫以csv格式存储:scrapy crawl news -o xxx.csv
在这里插入图片描述

如果觉得文章不错记得点赞哟~~

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Scrapy框架结合Selenium进行新闻的分析过程如下: 1. 确定目标:确定要新闻网站,并了解其页面结构、数据位置以及需要的数据类型。 2. 配置Scrapy项目:创建一个Scrapy项目,包括建立项目目录结构、配置虫规则、编写虫代码等。 3. 配置Selenium:将Selenium集成到Scrapy项目中,通过pip安装Selenium库,并下载相应的浏览器驱动程序(如ChromeDriver)。 4. 编写虫代码:在Scrapy项目中的虫代码中,创建一个虫类,并在该类中定义网站链接的解析方法和数据提规则。 5. 使用Selenium进行网页交互:在网页解析方法中,使用Selenium启动浏览器,并访问目标网址,以便进行网页的渲染和加载,确保获到动态生成的数据。 6. 分析网页结构和数据位置:使用Selenium的相关方法定位并提所需数据的位置,并将其保存到Scrapy的Item对象中。 7. 数据持久化:将提到的数据保存到数据库或者以其他方式进行持久化,可以使用Scrapy提供的Pipeline功能。 8. 运行虫:运行Scrapy项目,虫会按照预定的规则进行网页解析,并将数据提、保存、持久化。 9. 数据分析:根据需求进行数据分析,可以使用Python的数据分析工具(如Pandas、Numpy等)对到的新闻数据进行统计、处理、可视化等操作。 10. 定期维护:定期监控目标网站的变化,更新虫代码,以确保虫的正常运行和数据的准确性。 通过使用Scrapy框架结合Selenium进行新闻,我们可以实现对需要JavaScript渲染的网站的,提所需数据并进行后续的数据分析。同时,Scrapy提供了强大的虫功能,包括自动处理请求、解析网页、处理数据等,能够提高虫的效率和稳定性。而Selenium的集成则可以保证获到完整的动态生成的数据,使虫更具灵活性和适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值