利用scrapy框架爬取网站信息

scrapy简单说明
scrapy 为一个框架
框架和第三方库的区别:
库可以直接拿来就用,
框架是用来运行,自动帮助开发人员做很多的事,我们只需要填写逻辑就好

命令:
创建一个 项目 :
cd 到需要创建工程的目录中,
scrapy startproject stock_spider
其中 stock_spider 为一个项目名称

创建一个爬虫
cd ./stock_spider/spiders
scrapy genspider tonghuashun “http://basic.10jqka.com.cn/600004/company.html”
其中 tonghuashun 为一个爬虫名称
“http://basic.10jqka.com.cn/600004/company.html” 为爬虫的地址

在项目中添加main.py的文件

from scrapy.cmdline import execute
import sys
import os
#  调试的写法
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 注意函数中的[]   "tonghuashun"是之前创建的py文件
execute(["scrapy", "crawl", "tonghuashun"])

爬取网站信息数据的时候会可能遇到网站的反爬取设置,出现的问题是
DEBUG: Crawled (403) 或者 INFO: Ignoring response <403
解决问题:数据网站设置反爬虫技术,主要原因是我们是直接Get请求数据,而浏览器的请求是有Header的。基于这一点,把请求伪装成浏览器请求,就可以解决这个问题了。
第一种方法:在settings.py文件中加上

USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'

第二种方法:是对于大量的数据访问要求,添加头文件

# coding=utf-8
import urllib2 as ulb
import numpy as np
import PIL.ImageFile as ImageFile
import cv2
import random
# 收集到的常用Header
my_headers = [
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
    'Opera/9.25 (Windows NT 5.1; U; en)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
    "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]


# 用urllib2库链接网络图像
response = ulb.Request(url)
# 随机选择一个Header伪装成浏览器
response.add_header('User-Agent', random.choice(my_headers))

获得爬取内容后,为了方便直接调试网站信息是否被爬,直观检测是否成功,需要用scrapy shell
方法:在win+ r,cmd输入后切到命令行窗口,再进入到爬虫项目的文件夹下
再输入scrapy shell http://basic.10jqka.com.cn/600004/company.html’
即 scrapy shell + 被爬取的网站,后续操作如下

使用Scrapy爬取数据时,执行:
scrapy shell https://www.XXXX.com/e/1.html
报错:import win32api
ModuleNotFoundError: No module named ‘win32api’
解决办法:
是一个缺少依赖包的错误,只要给python装个库:pypiwin32。
pip install pypiwin32

在创建的scrapy框架中会生成很多py文件,不同文件的功能如下:
首先需要自己添加程序启动文件 main.py

from scrapy.cmdline import execute
import sys
import os
#  调试的写法
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 注意函数中的[] "tonghuashun""stock"是创建的py文件,也是项目文件,位于spiders文件夹下
# execute(["scrapy", "crawl", "tonghuashun"])
execute(["scrapy", "crawl", "stock"])   # 启动"stock"程序

第一层[一级目录]:
scrapy.cfg:配置文件,不需要更改
spider文件夹:第二层解释
第二层[二级目录]:
init.py特定文件,指明二级spider目录为一个python模块
items.py:定义需要的item类【实验中需要用到】
此文件下,是进行获得抓取的信息,即项目py文件中的变量
pipelines.py:管道文件,传入items.py中的item类,清理数据,保存或入库
此文件下,是进行存储逻辑设置,对应与项目py文件中的存储语句
settings.py:设置文件,例如设置用户代理和初始下载延迟
此文件下,需要设置

#USER_AGENT = 'stock_spider (+http://www.yourdomain.com)'
USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'    # 防止网站有反爬虫设置

ITEM_PIPELINES = {
    'stock_spider.pipelines.StockSpiderPipeline': 300,
    # 下面的语句是对pipelines.py中的StockPipeline函数作用
    'stock_spider.pipelines.StockPipeline': 1,
}

spiders目录:第三层解释
第三层【spiders项目py文件所在目录】
init.py特定文件,指明二级spider目录为一个python模块
这里是放自定义爬虫的py文件(项目自己创建文件),负责从html中获得数据,传入上一层管道文件中进行数据清理

利用scrapy框架爬取网站信息_第1张图片
stock.py: 自己创建的项目名称
Tonghuashun.py:自己创建的项目名称

Items.py:获得抓取的信息,即stock.py中的变量信息
pipelines.py:存储逻辑设置

settings.py: 爬取网站信息设置
csv文件:爬取信息后导入生成的数据文件
main.py: 自己添加的启动程序

问题:pycharm读取csv文件乱码的问题
解决方法:因为pycharm中默认设置是以utf-8的编码方式打开文件,而csv的文件正确读取方式是GBK,使用UTF-8自然会造成乱码
在pycharm的settings选项中修改File Encodings选项文件格式改为GBK
Editor ——> File Encodings ——> Project Encoding

利用scrapy框架爬取网站信息_第2张图片

安装TuShare模块
方式1:pip install tushare
方式2:访问https://pypi.python.org/pypi/tushare/下载安装
方式3:将源代码下载到本地python setup.py install

# Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程
import tushare as ts
# 获得股票行业信息
df = ts.get_industry_classified()
# 把返回的信息直接存储在 “stock_industry_prep.csv”
df.to_csv("stock_industry_prep.csv")
# 获得股票概念信息,并存储在 “stock_concept_prep.csv”文件
df = ts.get_concept_classified()
df.to_csv("stock_concept_prep.csv")




保存为csv格式
import tushare as ts
df = ts.get_hist_data('000875')#直接保存
df.to_csv('c:/day/000875.csv')#选择保存
df.to_csv('c:/day/000875.csv',columns=['open','high','low','close'])
保存为Excel格式
df = ts.get_hist_data('000875')#直接保存
df.to_excel('c:/day/000875.xlsx')#设定数据位置(从第3行,第6列开始插入数据)
df.to_excel('c:/day/000875.xlsx', startrow=2,startcol=5)
保存为HDF5文件格式
df = ts.get_hist_data('000875')
df.to_hdf('c:/day/hdf.h5','000875')
保存为JSON格式
df = ts.get_hist_data('000875')
df.to_json('c:/day/000875.json',orient='records')

你可能感兴趣的:(学习)