一、爬取新浪新闻思路1、创建scrapy项目2、分析新浪新闻网站静态页面代码3、编写对应的xpath公式4、写代码二、项目代码步骤1、创建scrapy项目

创建爬虫文件

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

python爬取头条网页内容_python爬取头条网页内容

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

python爬取头条网页内容_爬虫_02

新浪新闻的新闻页面都为

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'])

执行结果:

python爬取头条网页内容_python爬取头条网页内容_03

查看数据库:

python爬取头条网页内容_爬虫_04