1. 高考派大学数据----写在前面

终于写到了scrapy爬虫框架了,这个框架可以说是python爬虫框架里面出镜率最高的一个了,我们接下来重点研究一下它的使用规则。

安装过程自己百度一下,就能找到3种以上的安装手法,哪一个都可以安装上

可以参考 https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html 官方说明进行安装。

2. 高考派大学数据----创建scrapy项目

通用使用下面的命令,创建即可

scrapy startproject mySpider

完成之后,你的项目的目录结构为

每个文件对应的意思为

  • scrapy.cfg 项目的配置文件
  • mySpider/ 根目录
  • mySpider/items.py 项目的目标文件,规范数据格式,用来定义解析对象对应的属性或字段。
  • mySpider/pipelines.py 项目的管道文件,负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库)
  • mySpider/settings.py 项目的设置文件
  • mySpider/spiders/ 爬虫主目录
  • middlewares.py Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。 本篇文章没有涉及

高考派大学数据----创建Scrapy爬虫

通过命令行进入到 mySpider/spiders/ 目录,然后执行如下命令

scrapy genspider GaoKao "www.gaokaopai.com"

打开mySpider/spiders/ 目录里面的 GaoKao,默认增加了 下列代码

import scrapy

class GaoKaoSpider(scrapy.Spider):
name = "GaoKao"
allowed_domains = ["www.gaokaopai.com"]
start_urls = ['http://www.gaokaopai.com/'] def parse(self, response):
pass

默认生成的代码,包含一个GaoKaoSpider的类,并且这个类是用scrapy.Spider继承来的

而且默认实现了三个属性和一个方法

name = "" 这个是爬虫的名字,必须唯一,在不同的爬虫需要定义不同的名字

allowed_domains = [] 域名范围,限制爬虫爬取当前域名下的网页

start_urls =[] 爬取的URL元组/列表。爬虫从这里开始爬取数据,第一次爬取的页面就是从这里开始,其他的URL将会从这些起始的URL爬取的结果中生成

parse(self,response) 解析网页的方法,每个初始URL完成下载后将调用,调用的时候传入每一个初始URL返回的Response对象作为唯一参数,主要作用1、负责解析返回的网页数据,response.body 2、生成下一页的URL请求

高考派大学数据----第一个案例

我们要爬取的是高考派大学数据 数据为 http://www.gaokaopai.com/rank-index.html

页面下部有一个加载更多,点击抓取链接

尴尬的事情发生了,竟然是一个POST请求,本打算实现一个GET的,这回代码量有点大了~

scrapy 模式是GET请求的,如果我们需要修改成POST,那么需要重写Spider类的start_requests(self) 方法,并且不再调用start_urls里面的url了,所以,咱对代码进行一些修改。重写代码之后,注意下面这段代码

request = FormRequest(self.start_url,headers=self.headers,formdata=form_data,callback=self.parse)

FormRequest 需要引入模块 from scrapy import FormRequest

self.start_url 写上post请求的地址即可

formdata用来提交表单数据

callback调用网页解析参数

最后的 yield request 表示这个函数是一个生成器

import scrapy
from scrapy import FormRequest
import json from items import MyspiderItem
class GaokaoSpider(scrapy.Spider):
name = 'GaoKao'
allowed_domains = ['gaokaopai.com']
start_url = 'http://www.gaokaopai.com/rank-index.html' def __init__(self):
self.headers = {
"User-Agent":"自己找个UA",
"X-Requested-With":"XMLHttpRequest"
} # 需要重写start_requests() 方法
def start_requests(self):
for page in range(0,7):
form_data = {
"otype": "4",
"city":"",
"start":str(25*page),
"amount": "25"
} request = FormRequest(self.start_url,headers=self.headers,formdata=form_data,callback=self.parse)
yield request def parse(self, response):
print(response.body)
print(response.url)
print(response.body_as_unicode())

我们在 def parse(self, response): 函数里面,输出一下网页内容,这个地方,需要用到1个知识点是

获取网页内容 response.body response.body_as_unicode()

  • response.url获取抓取的rul
  • response.body获取网页内容字节类型
  • response.body_as_unicode()获取网站内容字符串类型

我们接下来就可以运行一下爬虫程序了

在项目根目录创建一个begin.py 文件,里面写入如下代码

from scrapy import cmdline
cmdline.execute(("scrapy crawl GaoKao").split())

运行该文件,记住在scrapy中的其他py文件中,运行是不会显示相应的结果的,每次测试的时候,都需要运行begin.py 当然,你可起一个其他的名字。

如果你不这么干的,那么你只能 采用下面的操作,就是比较麻烦。

cd到爬虫目录里执行scrapy crawl GaoKao--nolog命令
说明:scrapy crawl GaoKao(GaoKao表示爬虫名称) --nolog(--nolog表示不显示日志)

运行起来,就在控制台打印数据了,测试方便,可以把上述代码中那个数字7,修改成2,有心人能看到我这个小文字

pycharm在运行过程中,会在控制台打印很多红色的字,没事,那不是BUG

一定要在红色的字中间找到黑色的字,黑色的字才是你打印出来的数据,如下,得到这样的内容,就成功一大半了。

但是这个地方有个小坑,就是,你会发现返回的数据不一致,这个我测试了一下,是因为第一页的数据返回的不是JSON格式的,而是普通的网页,那么我们需要针对性处理一下,这个先不用管,我们把items.py 进行完善


import scrapy
class MyspiderItem(scrapy.Item):
# 学校名称
uni_name = scrapy.Field()
uni_id = scrapy.Field()
city_code = scrapy.Field()
uni_type = scrapy.Field()
slogo = scrapy.Field()
# 录取难度
safehard = scrapy.Field()
# 院校所在地
rank = scrapy.Field()

然后在刚才的GaokaoSpider类中,继续完善parse函数,通过判断 response.headers["Content-Type"] 去确定本页面是HTML格式,还是JSON格式。

        if(content_type.find("text/html")>0):
# print(response.body_as_unicode())
trs = response.xpath("//table[@id='results']//tr")[1:]
for item in trs:
school = MyspiderItem()
rank = item.xpath("td[1]/span/text()").extract()[0]
uni_name = item.xpath("td[2]/a/text()").extract()[0]
safehard = item.xpath("td[3]/text()").extract()[0]
city_code = item.xpath("td[4]/text()").extract()[0]
uni_type = item.xpath("td[6]/text()").extract()[0] school["uni_name"] = uni_name
school["uni_id"] = ""
school["city_code"] = city_code
school["uni_type"] = uni_type
school["slogo"] = ""
school["rank"] = rank
school["safehard"] = safehard
yield school else:
data = json.loads(response.body_as_unicode())
data = data["data"]["ranks"] # 获取数据 for item in data:
school = MyspiderItem()
school["uni_name"] = item["uni_name"]
school["uni_id"] = item["uni_id"]
school["city_code"] = item["city_code"]
school["uni_type"] = item["uni_type"]
school["slogo"] = item["slogo"]
school["rank"] = item["rank"]
school["safehard"] = item["safehard"]
# 将获取的数据交给pipelines,pipelines在settings.py中定义
yield school

parse() 方法的执行机制

  1. 使用yield返回数据,不要使用return。这样子parse就会被当做一个生成器。scarpy将parse生成的数据,逐一返回
  2. 如果返回值是request则加入爬取队列,如果是item类型,则交给pipeline出来,其他类型报错

到这里,如果想要数据准备的进入到 pipeline 中,你需要在setting.py中将配置开启

	# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'mySpider.pipelines.MyspiderPipeline': 300,
}

同时编写 pipeline.py 文件

import os
import csv class MyspiderPipeline(object): def __init__(self):
# csv 文件
store_file = os.path.dirname(__file__)+"/spiders/school1.csv"
self.file = open(store_file,"a+",newline='',encoding="utf-8")
self.writer = csv.writer(self.file) def process_item(self, item, spider):
try: self.writer.writerow((
item["uni_name"],
item["uni_id"],
item["city_code"],
item["uni_type"],
item["slogo"],
item["rank"],
item["safehard"]
)) except Exception as e:
print(e.args) def close_spider(self,spider):
self.file.close()

好了,代码全部编写完毕,还是比较简单的吧,把上面的数字在修改成7,为啥是7,因为只能获取到前面150条数据

Python爬虫入门教程 30-100 高考派大学数据抓取 scrapy的更多相关文章

  1. Python爬虫入门教程 23-100 石家庄链家租房数据抓取

    1. 写在前面 作为一个活跃在京津冀地区的开发者,要闲着没事就看看石家庄这个国际化大都市的一些数据,这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取 ...

  2. Python爬虫入门教程 21-100 网易云课堂课程数据抓取

    写在前面 今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了. 你第一步要做的是打开全部课程的地址,找出爬虫规律, 地址如下 ...

  3. Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取

    写在前面 从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院,CSDN学院,网易云课堂,慕课网 ...

  4. Python爬虫入门教程 15-100 石家庄政民互动数据爬取

    石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/14900 ...

  5. Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取

    写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都 ...

  6. Python爬虫入门教程第七讲: 蜂鸟网图片爬取之二

    蜂鸟网图片--简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文 ...

  7. Python爬虫:新浪新闻详情页的数据抓取(函数版)

    上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...

  8. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  9. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

随机推荐

  1. SpringBoot与日志框架1(基本使用)

    一.日志框架 1.无论在什么系统,日志框架都是一个重要角色,所以理解和用好日志框架是相当重要的:像JDBC一样,日志框架分为接口层的门面和具体的实现组成. 2.市面上的产品: 2.1门面:SLF4J( ...

  2. OI退役

    OI退役 by war 其实初中时就想自学编程,但是这个愿望并没有很强烈,加上中考的压力就没有实践.在中考前夕看到的现在的机房,哇,计算机奥赛.但是在机房里的可能是一神和奥神,也许有凯哥. 高一寒假学 ...

  3. 【省选十连测之一】【线段树】【最小生成树之Kruskal】公路建设

    目录 题意 输入格式 输出格式 数据范围 思路 代码 题意 有n个点,m条双向道路,其中第条公路的两个端点是u[i],v[i],费用是c[i]. 现在给出q个询问,每次给定一个L和一个R,要求你只能够 ...

  4. 代码调用t.cn接口生成短址

    新浪短网址接口的稳定性和跳转速度还是很给力的,现给出其API说明. 该接口支持两种返回格式:xml和json 对应的URL请求地址为: xml:http://api.t.sina.com.cn/sho ...

  5. [R]R包版本更迭【持续更新】

    由于R版本更迭,网上或旧的教材上的包可能没有在维护,或者被其他包替代. 做一个表记录碰到的一些替代方案.个人向,非完整指南. * mvpart 2014年之后不再更新,R 3.0版本后无法安装, 提示 ...

  6. 用python写一个非常简单的QQ轰炸机

    闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...

  7. JavaScript中实现小数点后保留2位

    在项目中有时候会遇到要求输入的数字是整数或者小数点后绑定2位小数,因此可以用.toFixed(2)方法 下面是关于toFixed()方法的demo: <input type="numb ...

  8. connector for python实验

    MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读 MySQL 教程. 下面为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-conne ...

  9. pip离线安装依赖包

    pip安装离线本地包 导出本地已有的依赖包 pip freeze > requirements.txt 将依赖包下载到本地 # 下载到当前目录,指定pip源 pip download -r re ...

  10. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别

    二.也是平时经常用到的offsetheight 它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去的,以上代码为例,结果显示上图h2 ...