python网页数据抓取(高考派大学数据--写在前面终于写到了scrapy爬虫框架了 )
优采云 发布时间: 2022-03-28 05:23python网页数据抓取(高考派大学数据--写在前面终于写到了scrapy爬虫框架了
)
1.高考大学资料----写在前面
最后写了scrapy爬虫框架。这个框架可以说是python爬虫框架中出镜率最高的一个。接下来,我们将重点介绍它的使用规则。
安装过程中可以通过百度找到3种以上的安装方式,任何一种都可以安装
安装可以参考官方说明。
2.高考高校数据----创建scrapy项目
常用如下命令创建
scrapy startproject mySpider
完成后,您的项目的目录结构是
每个文件对应的含义是
高考高校数据----创建爬虫
通过命令行进入mySpider/spiders/目录,然后执行如下命令
scrapy genspider 高考“”
打开mySpider/spiders/目录下的高考,默认添加如下代码
默认生成的代码中收录一个GaoKaoSpider类,该类继承自scrapy.Spider
它默认实现了三个属性和一个方法
name = "" 这是爬虫的名字,必须是唯一的。不同的爬虫需要定义不同的名称
allowed_domains = [] 域名范围,限制爬虫爬取当前域名下的网页
start_urls=[] 元组/要抓取的 URL 列表。爬虫从这里开始爬取数据,第一个爬取的页面从这里开始,然后会根据这些初始的URL爬取结果生成其他的URL
parse(self,response) 解析网页的方法。下载每个初始 URL 后都会调用它。调用时,每个初始 URL 返回的 Response 对象作为唯一参数传递。主要功能是1、负责解析返回的网页数据,response.body2、生成下一页的URL请求
高考大学数据----第一个案例
我们要爬取的是高考发送的大学数据数据为
页面底部有一个加载更多,点击抓取链接
尴尬的事情发生了,原来是一个POST请求,本来是要实现一个GET的,这次代码量有点大~
scrapy 模式是一个 GET 请求。如果我们需要改成POST,那么就需要重写Spider类的start_requests(self)方法,不再调用start_urls中的url,所以我们对代码做一些修改。改写代码后,注意以下代码
请求 = FormRequest(self.start_url,headers=self.headers,formdata=form_data,callback=self.parse)
FormRequest 需要从 scrapy import FormRequest 导入模块
self.start_url 只写post请求的地址
formdata 用于提交表单数据
回调调用网页解析参数
最终的 yield 请求表明该函数是一个*敏*感*词*
在 def parse(self, response): 函数中,我们输出网页的内容。在这个地方,我们需要用到一个知识点:
获取网页内容 response.bodyresponse.body_as_unicode()
然后我们可以运行爬虫程序
在项目根目录下创建begin.py文件,在里面写入如下代码
from scrapy import cmdlinecmdline.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
然后在刚才的高考蜘蛛类中,继续完善解析功能,通过判断response.headers["Content-Type"]来判断页面是HTML格式还是JSON格式。
parse() 方法的执行机制
使用yield返回数据,不要使用return。这样 parse 将被视为*敏*感*词*。Scarpy 将 parse 生成的数据一一返回
如果返回值为request,则将其加入爬取队列。如果是item类型,就会交给pipeline。其他类型会报错。
此时,如果要将数据准备输入到管道中,则需要在setting.py中启用配置
还要写 pipeline.py 文件
好了,代码都写好了,还是比较简单的,把上面的数字改成7,为什么是7,因为只能获取前150条数据