创建爬虫文件
scrapy startproject mysqlpjt
进入项目目录后
scrapy genspider -t crawl bangbing sina.com.cn
新浪新闻的新闻页面都为
http://news.sina.com.cn/o/2018-03-21/doc-ifysnmez6568198.shtml
由此可以写出正则表达式.*?/[0-9]{4}.[0-9]{2}.[0-9]{2}.*?shtml
所以创建crawl模板的爬虫文件,找出首页中所有符合这个条件的页面进行爬取
此次只爬取文章标题以及关键词 所以直接写出具体的xpath公式了 标题:/html/head/title/text() 关键词:/html/head/meta[@name='keywords']/@content
# -*- 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自动爬取新浪新闻网页标题和链接
# -*- coding: utf-8 -*-
import scrapy
class MysqlpjtItem(scrapy.Item):
# 建立name存储网页标题
title = scrapy.Field()
# 建立keywd存储网页关键词
keywd = scrapy.Field()
# -*- 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()
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
# 取消注释
ITEM_PIPELINES = {
'mycwpjt.pipelines.MycwpjtPipeline': 300,
}
# 此处是为了在IDE或pycharm中直接执行scrapy,运行此文件即可
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'bangbing'])
执行结果:
查看数据库: