Scrapy相关知识及项目实战
前言
本博客会先介绍Scrapy的基础知识,再讲解1个相关实战项目。非常基础,具体视频以及课件,在中国大学MOOC里可以找到,由北京理工大学,嵩天教授主讲:Python网络爬虫与信息提取
一、Scrapy相关知识
主要介绍Scrapy的框架,以及如何使用
1:Scrapy的安装:
Scrapy是一个快速功能强大的网络爬虫框架。
如果出现错误,大部分是需要安装twisted库,方法如下
2:Scrapy框架简介(三个数据流):
1)数据流一:
2)数据流二:
3)数据流三:
4)Scrapy框架需要用户写的地方:
3:Scrapy框架的使用
2)建立爬虫工程:
3)在工程中产生一个Scrapy爬虫:
4)配置产生的爬虫:
5)运行爬虫,获取网页:
6)总结使用Scrapy的框架方法:
二、股票数据Scrapy爬虫项目实战
1.网页介绍与预期想要的结果
2)再从这里获得股票的具体相关信息
3)输入url链接后,输出如下图:
2.爬虫思路分析以及标签可行性分析
1)总体思路:
2):标签分析
1> 先找到/gs/sh_600000.shtml,然后得到6位数字,
2> 找到相应的单股的信息标签:
先用xpath找到最近的script标签,再将各个值从列表里提取出来
3.程序步骤
4.代码展示
1)建立工程和Spider模板
2)编写Spider,代码如下
import scrapy
import re
class StocksSpider(scrapy.Spider):
name = 'stocks'
#allowed_domains = ['baidu.com']
start_urls = ['http://quote.stockstar.com/stock/stock_index.htm']
def parse(self, response):
for href in response.css('a::attrs(href)').extract():
try:
stock = re.search(r'/gs/sh_\d{6}.shtml', href).group(0).split('_')[1].split('.')[0]
print(stock)
url = "http://quotes.money.163.com/" + '0' + stock + '.html'
yield scrapy.Request(url, callback = self.parse_stock)
except:
continue
def parse_stock(self, response):
infoDict = {}
script = response.xpath('//div[@class="relate_stock clearfix"]/script[1]').extract()
info = script[0].strip().split(',')
infoDict['股票名称'] = eval(re.search(r'name\: \'.*\'', info[0]).group(0).split(':')[1])
infoDict['股票代码'] = eval(re.search(r'code\: \'\d{6}\'', info[1]).group(0).split(":")[1])
infoDict['现价'] = eval(re.search(r'price\: \'.*\'', info[2]).group(0).split(":")[1])
infoDict['涨跌幅'] = re.search(r'change\: \'.*%', info[3]).group(0).split("'")[1]
infoDict['昨收'] = eval(re.search(r'yesteday\: \'.*\'', info[4]).group(0).split(":")[1])
infoDict['今开'] = eval(re.search(r'today\: \'.*\'', info[5]).group(0).split(":")[1])
infoDict['最高'] = eval(re.search(r'high\: \'.*\'', info[6]).group(0).split(":")[1])
infoDict['最低'] = eval(re.search(r'low\: \'.*\'', info[7]).group(0).split(":")[1])
yield infoDict
3)编写Pipelines,代码如下:
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class BaidustocksPipeline(object):
def process_item(self, item, spider):
return item
class BaidustocksInfoPipeline(object):
def open_spider(self, spider):
self.f = open('BaiduStockInfos.txt', 'w')
def close_spider(self, spider):
self.f.close()
def process_item(self, item , spider):
try:
line = str(dict(item)) + '\n'
self.f.write(line)
except:
pass
return item
4)配置ITEM_PIPELINES选项:
找到ITEM_PIPELINES 取消掉注释,并更改BaidustocksInfo
5)执行程序:
5.代码几个点需要注意的地方:
1)Stocks.py的编写,Xpath的用于需要注意下。