Java爬虫之爬取中中原人民共和国高级高校排行前

在博客:Python爬虫——爬取中夏族民共和国大学排行前100名并写入MySQL中,大家使用Python来写爬虫,将 中的高校排行表格爬收取来,并存入到MySQL中。 此番分享将用Java的Jsoup API来贯彻平等的成效,并将爬取到的多寡存入到MongoDB数据库中。

实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250,scrapytop250

设置配备Scrapy

在设置Scrapy前率先须要规定的是已经安装好了Python(近些日子Scrapy帮助Python2.5,Python2.6和Python2.7)。官方文书档案中介绍了二种方法进行安装,笔者使用的是行使 easy_install 进行安装,首先是下载Windows版本的setuptools(下载地址:
设置完setuptool以往。实施CMD,然后运转一下限令:

easy_install -U Scrapy

同一的您能够采用采用pip安装,pip的地点:
动用pip安装Scrapy的授命为

pip install Scrapy

借使你的Computer先前装过visual studio 二零零六 或 visual studio 二〇〇八那么共同顺遂,Scrapy已经安装到位。如若出现下列报错:Unable to find vcvarsall.bat 那么你要求折腾下。你可以安装visual studio 后开展设置或应用下边包车型客车点子开展解决:
第一安装MinGW(MinGW下载地址:
把MinGW的路线增添到遇到变量path中,比如自个儿把MinGW安装到D:MinGW中,就把D:MinGWbin添加到path中;
张开命令行窗口,在指令行窗口中进入到要安装代码的目录下;
输入如下命令 setup.py install build –compiler=mingw32 就足以设置了。

一经出现“xslt-config' 不是中间或外界命令,亦非可运营的程序或批管理公事。”错误,原因根本是lxml安装不成功,只要上
上边就足以进来正题了。

新建筑工程程 让大家来用爬虫获取豆瓣电影Top 250的影片音讯呢。开始此前,我们新建三个Scrapy工程。因为自个儿用的Win7,所以在CMD中跻身二个自小编梦想保留代码的目录,然后实施:

D:WEBPython>scrapy startproject doubanmoive

这几个命令会在当前目录下创设一个新的目录doubanmoive,目录结构如下:

D:WEBPythondoubanmoive>tree /f
Folder PATH listing for volume Data
Volume serial number is 00000200 34EC:9CB9
D:.
│ scrapy.cfg
│
└─doubanmoive
 │ items.py
 │ pipelines.py
 │ settings.py
 │ __init__.py
 │
 └─spiders
   __init__.py

那一个文件珍视为:

  • doubanmoive/items.py: 定义必要得到的始末字段,类似于实体类。
  • doubanmoive/pipelines.py: 项目管道文件,用来管理Spider抓取的数额。
  • doubanmoive/settings.py: 项目布置文件
  • doubanmoive/spiders: 放置spider的目录

概念项目(Item)

Item是用来装载抓取数据的容器,和Java里的实体类(Entity)相比像,打开doubanmoive/items.py能够看看默许创立了以下代码。

from scrapy.item import Item, Field

class DoubanmoiveItem(Item):
  pass

笔者们只需求在 Doubanmoive 类中扩张内需抓取的字段就能够,如 name=Field() ,最终根据大家的必要完毕代码如下。

from scrapy.item import Item, Field

class DoubanmoiveItem(Item):
 name=Field()#电影名
 year=Field()#上映年份
 score=Field()#豆瓣分数
 director=Field()#导演
 classification=Field()#分类
 actor=Field()#演员

编写爬虫(Spider)

Spider是任何项目中最主旨的类,在这一个类里大家会定义抓取对象(域名、UENCOREL)以及抓取准则。Scrapy官方文书档案中的教程是依照BaseSpider 的,但 BaseSpider 只可以爬取给定的U凯雷德L列表,无法依据叁个伊始的UOdysseyL向外拓宽。不过除了 BaseSpider ,还应该有众多能够一直接轨 Spider 的类,比方scrapy.contrib.spiders.CrawlSpider 。

在 doubanmoive/spiders 目录下新建moive_spider.py文件,并填写代码。

# -*- coding: utf-8 -*-
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from doubanmoive.items import DoubanmoiveItem

class MoiveSpider(CrawlSpider):
 name="doubanmoive"
 allowed_domains=["movie.douban.com"]
 start_urls=["http://movie.douban.com/top250"]
 rules=[
  Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/top250?start=d+.*'))),
  Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/subject/d+')),callback="parse_item"),  
 ]

 def parse_item(self,response):
  sel=Selector(response)
  item=DoubanmoiveItem()
  item['name']=sel.xpath('//*[@id="content"]/h1/span[1]/text()').extract()
  item['year']=sel.xpath('//*[@id="content"]/h1/span[2]/text()').re(r'((d+))')
  item['score']=sel.xpath('//*[@id="interest_sectl"]/div/p[1]/strong/text()').extract()
  item['director']=sel.xpath('//*[@id="info"]/span[1]/a/text()').extract()
  item['classification']= sel.xpath('//span[@property="v:genre"]/text()').extract()
  item['actor']= sel.xpath('//*[@id="info"]/span[3]/a[1]/text()').extract()
  return item

代码表明: MoiveSpider 承接Scrapy中的 CrawlSpider , name , allow_domains , start_url 看名字就了解怎么着意思,个中rules稍微复杂一些,定义了U瑞虎L的抓取法则,适合allow 正则表明式的链接都会投入到Scheduler(调整程序)。通过解析豆瓣电影Top250的分页U牧马人L 能够赢得以下法规

Rule(SgmlLinkExtractor(allow=(r''))),
而笔者辈实在要抓取的页面是每一个电影的详细介绍,如肖申克的救赎的链接为 ,那独有 subject 前面包车型大巴数字是调换的,依据正则表明式获得如下代码。大家需求抓取这系列型链接中的内容,于是参预callback属性,将Response交给parse_item函数来管理。

Rule(SgmlLinkExtractor(allow=(r'"),     
在 parse_item 函数中的管理逻辑非常轻易,获取相符条件链接的代码,然后依照早晚的法则抓取内容赋给item并重回Item Pipeline 。获取超越八分之四标签的剧情不要求编写制定复杂的正则说明式,大家可以利用 XPath 。 XPath 是一门在 XML 文书档案中查找新闻的言语,但它也得以用在HTML中。下表列出了常用表明式。

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

如 //*[@id="content"]/h1/span[1]/text() 获取的结果是在id为content的任性成分下h1成分下的span列表中首先个要素的文书内容。大家得以经过Chrome开采者工具(F12)来取得某内容的XPath表明式,具体操作为在急需抓取的内容上点击调查成分,下方就能够冒出开垦者工具,并定位到该因素,在剧情上点击右键,采纳复制XPath。

图片 1

积存数据

爬虫获取到数量未来大家必要将其积攒到数据库中,从前大家提到该操作供给靠项目管道(pipeline)来拍卖,其平时实行的操作为:

  • 清洗HTML数据
  • 表明深入分析到的数码(检查项目是或不是带有须要的字段)
  • 检查是不是是重复数据(假诺重新就删除)
  • 将剖判到的数目存款和储蓄到数据库中

是因为大家获取的多寡格式多样三种,有一对囤积在关系型数据库中并不实惠,所以本身在写完MySQL版本的Pipeline之后又写了多少个MongoDB的。

MySQL版本: 

# -*- coding: utf-8 -*-
from scrapy import log
from twisted.enterprise import adbapi
from scrapy.http import Request

import MySQLdb
import MySQLdb.cursors


class DoubanmoivePipeline(object):
 def __init__(self):
  self.dbpool = adbapi.ConnectionPool('MySQLdb',
    db = 'python',
    user = 'root',
    passwd = 'root',
    cursorclass = MySQLdb.cursors.DictCursor,
    charset = 'utf8',
    use_unicode = False
  )
 def process_item(self, item, spider):
  query = self.dbpool.runInteraction(self._conditional_insert, item)
  query.addErrback(self.handle_error)
  return item

 def _conditional_insert(self,tx,item):
  tx.execute("select * from doubanmoive where m_name= %s",(item['name'][0],))
  result=tx.fetchone()
  log.msg(result,level=log.DEBUG)
  print result
  if result:
   log.msg("Item already stored in db:%s" % item,level=log.DEBUG)
  else:
   classification=actor=''
   lenClassification=len(item['classification'])
   lenActor=len(item['actor'])
   for n in xrange(lenClassification):
    classification+=item['classification'][n]
    if n<lenClassification-1:
     classification+='/'
   for n in xrange(lenActor):
    actor+=item['actor'][n]
    if n<lenActor-1:
     actor+='/'

   tx.execute(
    "insert into doubanmoive (m_name,m_year,m_score,m_director,m_classification,m_actor) values (%s,%s,%s,%s,%s,%s)",
    (item['name'][0],item['year'][0],item['score'][0],item['director'][0],classification,actor))
   log.msg("Item stored in db: %s" % item, level=log.DEBUG)

 def handle_error(self, e):
  log.err(e)

MongoDB版本:

# -*- coding: utf-8 -*-
import pymongo

from scrapy.exceptions import DropItem
from scrapy.conf import settings
from scrapy import log

class MongoDBPipeline(object):
 #Connect to the MongoDB database
 def __init__(self):
  connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
  db = connection[settings['MONGODB_DB']]
  self.collection = db[settings['MONGODB_COLLECTION']]

 def process_item(self, item, spider):
  #Remove invalid data
  valid = True
  for data in item:
   if not data:
   valid = False
   raise DropItem("Missing %s of blogpost from %s" %(data, item['url']))
  if valid:
  #Insert data into database
   new_moive=[{
    "name":item['name'][0],
    "year":item['year'][0],
    "score":item['score'][0],
    "director":item['director'],
    "classification":item['classification'],
    "actor":item['actor']
   }]
   self.collection.insert(new_moive)
   log.msg("Item wrote to MongoDB database %s/%s" %
   (settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
   level=log.DEBUG, spider=spider) 
  return item

能够看看其基本的管理流程是一样,然则MySQL不太有利的一点便是索要将数组类型的数量经过分隔符转变。而MongoDB协理存入List、Dict等七种类型的数码。

陈设文件

在运营爬虫以前还亟需将要 settings.py 中加进部分陈设消息。

BOT_NAME = 'doubanmoive'
SPIDER_MODULES = ['doubanmoive.spiders']
NEWSPIDER_MODULE = 'doubanmoive.spiders'
ITEM_PIPELINES={
 'doubanmoive.mongo_pipelines.MongoDBPipeline':300,
 'doubanmoive.pipelines.DoubanmoivePipeline':400,
}
LOG_LEVEL='DEBUG'

DOWNLOAD_DELAY = 2
RANDOMIZE_DOWNLOAD_DELAY = True
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
COOKIES_ENABLED = True

MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'python'
MONGODB_COLLECTION = 'test'

ITEM_PIPELINES 中定义了MySQL和MongoDB七个Pipeline文件,前面的数字代表执行的事先级依次,范围为0~一千。 而中间的 DOWNLOAD_DELAY 等消息是为了防守爬虫被豆瓣Ban掉,增添了部分随机延迟,浏览器代理等。最终的正是MongoDB的配备消息,MySQL也得以参照这种措施来写。

时现今天截至,抓取豆瓣电影的爬虫就已经到位了。在指令行中实行 Scrapy crawl doubanmoive 让蜘蛛早先爬行吧!

作者们就要Eclipse中写程序,由此,需求下载以下jar包:

你或然感兴趣的篇章:

  • 深切深入分析Python的爬虫框架Scrapy的构造与运作流程
  • 零基础写python爬虫之使用Scrapy框架编写爬虫
  • 零基础写python爬虫之爬虫框架Scrapy安装配备
  • Python爬虫框架Scrapy安装使用手续
  • python使用scrapy解析js示例
  • Python使用scrapy采撷数据经过中放回下载过大页面包车型大巴点子
  • Python打字与印刷scrapy蜘蛛抓取树结构的章程
  • Python的Scrapy爬虫框架轻易学习笔记

安装配置Scrapy 在设置Scrapy前率先要求鲜明的是早已安装好了Python(如今Scrapy帮衬...

  • bson-3.6.3.jar
  • jsoup-1.10.3.jar
  • mongodb-driver-3.6.3.jar
  • mongodb-driver-core-3.6.3.jar

新建webScraper项目和jsoupScraper包,并将上述jar包加入到花色路径中,如下图:

图片 2webScraper项目

在jsoupScraper包下新建JsoupScaper.java文件,其完全代码如下:

package jsoupScraper;/* 本爬虫利用Jsoup爬取中国大学排血排行榜前100名 * 并将爬取后的结果存入到MongoDB数据库中 */import java.util.List;import java.util.ArrayList;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.select.Elements;import java.net.*;import java.io.*;import com.mongodb.MongoClient;import com.mongodb.client.MongoCollection;import com.mongodb.client.MongoDatabase;public class JsoupScraper { public static void main(String[] args) { String url = "http://gaokao.xdf.cn/201702/10612921.html"; insertIntoMongoDB; } // insertIntoMongoDB()函数:将爬取的表格数据插入到MongoDB中 public static void insertIntoMongoDB(String url) { try{ // 连接到本地的 mongodb 服务 MongoClient mongoClient = new MongoClient("localhost", 27017); // 连接到university数据库,不过该数据库不存在,则创建university数据库 MongoDatabase mongoDatabase = mongoClient.getDatabase("university"); System.out.println("Connect to database successfully"); // 创建集合,该集合事先不存在 mongoDatabase.createCollection; System.out.println; // 将爬取的表格数据作为文档分条插入到新建的集合中 MongoCollection<org.bson.Document> collection = mongoDatabase.getCollection; System.out.println("集合 test 选择成功"); List<String> content = getContent; for(int i=2; i<content.size { String[] record = content.get.split; org.bson.Document document = new org.bson.Document("rank", record[0]). append("name", record[1]). append("province", record[2]). append("local_rank",record[3]). append("score", record[4]). append("type", record[5]). append("stars", record[6]). append("level", record[7]); List<org.bson.Document> documents = new ArrayList<org.bson.Document>(); documents.add; collection.insertMany(documents); System.out.println("第"+i+"条文档插入成功"); } // 关闭mongodb连接 mongoClient.close(); System.out.println("MongoDB连接已关闭"); } catch(Exception e){ e.printStackTrace(); } } // getContent()函数,返回爬取的表格数据 public static List<String> getContent(String url){ List<String> content = new ArrayList<String>(); // 利用URL解析网址 URL urlObj = null; try{ urlObj = new URL; } catch(MalformedURLException e){ System.out.println("The url was malformed!"); return content; } // URL连接 URLConnection urlCon = null; try{ // 打开URL连接 urlCon = urlObj.openConnection(); // 将HTML内容解析成UTF-8格式 Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url); // 刷选需要的网页内容 Elements elems = doc.getElementsByTag.first().children(); // 提取每个字段的文字部分 content = elems.eachText(); return content; } catch(IOException e){ System.out.println("There was an error connecting to the URL"); return content; } }}

运作上述顺序,结果如下:

图片 3程序运转结果

前往MongoDB数据库中查阅,如下图:

图片 4MongoDB数据库

该爬虫其实并不复杂,完结的准绳也相当粗略,大家曾经用能Java和Python来贯彻了。希望以后能写一些关于Java爬虫的篇章,迎接大家沟通~~

本文由365bet体育在线官网发布于网络工程,转载请注明出处:Java爬虫之爬取中中原人民共和国高级高校排行前

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。