python网页数据抓取(高考派大学数据--写在前面终于写到了scrapy爬虫框架了 )

优采云 发布时间: 2022-03-28 05:23

  python网页数据抓取(高考派大学数据--写在前面终于写到了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条数据

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线