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

19Python爬虫--爬取新浪新闻标题并保存到数据库

程序员文章站 2022-05-02 22:01:23
...

一、爬取新浪新闻思路

1、创建scrapy项目
2、分析新浪新闻网站静态页面代码
3、编写对应的xpath公式
4、写代码

二、项目代码

步骤1、创建scrapy项目

创建爬虫文件

scrapy startproject mysqlpjt
进入项目目录后
scrapy genspider -t crawl bangbing sina.com.cn

19Python爬虫--爬取新浪新闻标题并保存到数据库

步骤2、分析新浪网站静态代码

19Python爬虫--爬取新浪新闻标题并保存到数据库
新浪新闻的新闻页面都为
http://news.sina.com.cn/o/2018-03-21/doc-ifysnmez6568198.shtml
由此可以写出正则表达式.*?/[0-9]{4}.[0-9]{2}.[0-9]{2}.*?shtml
所以创建crawl模板的爬虫文件,找出首页中所有符合这个条件的页面进行爬取

步骤3、编写对应的xpath公式

此次只爬取文章标题以及关键词
所以直接写出具体的xpath公式了
标题:/html/head/title/text()
关键词:/html/head/meta[@name='keywords']/@content

步骤4、写代码
1、bangbing .py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from mysqlpjt.items import MysqlpjtItem

class BangbingSpider(CrawlSpider):
    name = 'bangbing'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']

    rules = (
        Rule(LinkExtractor(allow=(r'.*?/[0-9]{4}.[0-9]{2}.[0-9]{2}.doc-.*?shtml'), allow_domains=('sina.com.cn')),
             callback='parse_item',
             follow=True),
    )

    def parse_item(self, response):
        i = MysqlpjtItem()
        # 通过XPath表达式提取网页标题
        i['title'] = response.xpath("/html/head/title/text()").extract()
        # 通过XPath表达式提取网页的关键词
        i['keywd'] = response.xpath("/html/head/meta[@name='keywords']/@content").extract()
        return i

在上面代码中rules部分中的LinkExtractor什么意思可以看上一章18Python爬虫—CrawlSpider自动爬取新浪新闻网页标题和链接

2、items.py
# -*- coding: utf-8 -*-

import scrapy

class MysqlpjtItem(scrapy.Item):
    # 建立name存储网页标题
    title = scrapy.Field()
    # 建立keywd存储网页关键词
    keywd = scrapy.Field()
3、pipelines.py
# -*- coding: utf-8 -*-

import pymysql

class MysqlpjtPipeline(object):
    def __init__(self):
    # 连接数据库
    # spider数据库中 只有一个表为mydb,表中有两个字段title和keywd
        self.conn = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="spider")


    def process_item(self, item, spider):
        # 将获取到的name和keywd分别赋给变量name和变量keywd
        title = item["title"][0]
        # 可能存在没有关键词的情况 如果直接填入item["keywd"][0]可能会出现数组溢出的情况
        if item["keywd"]:
            keywd = item["keywd"][0]
        else:
            keywd = ""
        # 构造对应的sql语句
        sql = "insert into mydb(title, keywd) values('" + title + "','" + keywd + "')"
        # 通过query实现执行对应的sql语句
        self.conn.query(sql)
        # 提交
        self.conn.commit()
        return item

    def close_spider(self, spider):
    # 关闭数据库连接
        self.conn.close()
4、settings.py
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
# 取消注释
ITEM_PIPELINES = {
   'mycwpjt.pipelines.MycwpjtPipeline': 300,
}
4、run.py
# 此处是为了在IDE或pycharm中直接执行scrapy,运行此文件即可
from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'bangbing'])

执行结果:
19Python爬虫--爬取新浪新闻标题并保存到数据库
查看数据库:
19Python爬虫--爬取新浪新闻标题并保存到数据库

有任何疑问可以在下方回复,看到一定会回答