This action will force synchronization from luosl/webmagicx, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
webmagicx是一款可配置爬虫框架,webmagicx中的webmagic表示该框架扩展于webmagic,x表示该框架是一个基于xml的配置型爬虫框架。 得益于webmagic强大的可扩展能力,本框架实现了以下特性:
jdk1.8以上
使用二进制包开始第一个爬虫
webmagicx提供了可执行的二进制包,免去了编译痛苦,直接下载就可以使用。二进制包中,内置了一个抓取豆瓣电影信息的爬虫配置文件,你只需要以下步骤,就可以启动你的第一个爬虫,抓取豆瓣电影:
webmagicx
└ spiderConf → 爬虫配置文件目录,用于存放爬虫配置文件
└ douban.spider.xml → 爬虫配置文件,请放到格式为xml,请放到spiderConf目录下,请务必以.spider.xml结尾
└ bin → 命令路径
└ start.bat → windos环境下,快捷启动命令
└conf → 项目配置
└ log4j.properties → 项目日志配置文件
└ lib → 项目依赖
webmagicx的配置文件
爬虫配置是webmagicx的核心,至于配置文件选用xml格式的原因有以下几点:
说了这么多,其实配置也就这几个部分:
列举了这么,其实下面的配置文件就说的很清楚了。。。。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- enable代表该爬虫是否启用 -->
<spider enable="true">
<!-- 任务描述 -->
<desc>抓豆瓣电影信息</desc>
<!-- 定时任务配置,当startNow为true,任务会马上启动 -->
<!--<task startNow="true" corn="0 0 */1 * * ?" />-->
<!-- 起始url列表,可以配置多个 -->
<startUrls>
<url>https://movie.douban.com/subject/26662193/?from=showing</url>
</startUrls>
<!-- 目标url正则,可以配置多个 -->
<targetUrlRegexs>
<!-- xpath可以限定目标url的抽取范围 -->
<regex xpath="//*div[@class='recommendations-bd']">https://movie\.douban\.com/subject.*</regex>
</targetUrlRegexs>
<!-- 爬虫属性 -->
<attribute>
<!-- 最大抓取深度,默认为-1 -->
<maxDeep>1</maxDeep>
<!-- 字符集,默认为UTF-8 -->
<charset>UTF-8</charset>
<!-- 超时(毫秒),默认为20000 -->
<timeout>20000</timeout>
<!-- 线程数,默认为1 -->
<threadNum>3</threadNum>
<!-- 抓取失败后的重试次数,默认为0 -->
<retryTimes>0</retryTimes>
<!-- 每次抓取后的睡眠时间,默认为1000 -->
<sleep>1000</sleep>
</attribute>
<!-- 组件配置 -->
<components>
<!-- 下载处理 -->
<downloadHandler>
<!--
| src 源字段:由field中配置,或handler中产生的字段名称)
| target 目标字段 当目标字段已经存在时,原目标字段会被覆盖
| retryTimes 重试次数:若下载失败,重试的次数
| saveDir 文件保存文件夹;
| returnValue 下载文件后的返回值,取值 md5、path、fileName;
分别表示文件md5值、文件绝对路径、文件名。
-->
<download src="imgUrl" target="imgPath" retryTimes="2" saveDir="img" returnValue="path" />
</downloadHandler>
<!-- 文本处理 -->
<textHandler>
<!-- 替换info字段中的/为, -->
<!-- src :原字段,target:生成的目标字段,expression:需要替换的表达式,replaceAs:需要替换为的字段 -->
<replaceAll src="info" target="info" expression=" / " replaceAs=","/>
<!-- 导演 -->
<!-- src :原字段,target:生成的目标字段,expression:正则表达式,takeIndex:取匹配到的第几个字段 -->
<find src="info" target="dy" expression="导演: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<split src="dy" target="dy" expression=" " takeIndex="1"/>
<!-- 编剧 -->
<find src="info" target="bj" expression="编剧: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<replaceAll src="bj" target="bj" expression="编剧: " replaceAs=""/>
<!-- 主演 -->
<find src="info" target="zy" expression="主演: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<replaceAll src="zy" target="zy" expression="主演: " replaceAs=""/>
<!-- 类型 -->
<find src="info" target="lx" expression="类型: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<replaceAll src="lx" target="lx" expression="类型: " replaceAs=""/>
<!-- 制片国家/地区 -->
<find src="info" target="dq" expression="制片国家/地区: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<replaceAll src="dq" target="dq" expression="制片国家/地区: " replaceAs=""/>
<!-- 片长 -->
<find src="info" target="pc" expression="片长: +[0-9a-zA-Z\u2E80-\u9FFF\.·\-,\)\(]+ " takeIndex="0"/>
<replaceAll src="pc" target="pc" expression="片长: " replaceAs=""/>
<!-- 又名 -->
<find src="info" target="ym" expression="又名: .+IMDb链接" takeIndex="0"/>
<replaceAll src="ym" target="ym" expression="IMDb链接|又名:" replaceAs=""/>
<!-- IMDb链接 -->
<find src="info" target="imdb" expression="IMDb链接: [0-9a-z]+" takeIndex="0" must="false"/>
<replaceAll src="imdb" target="imdb" expression="IMDb链接: " replaceAs="" />
<!-- 上映日期 -->
<find src="info" target="syrq" expression="\d{4}-\d{2}-\d{2}" takeIndex="0" must="false"/>
</textHandler>
<!-- 管道配置 -->
<!-- jdbc管道 -->
<!--<jdbcPipeline>-->
<!--<!– 写模式,当前支持 override 和 append ,分别代表覆盖和追加 –>-->
<!--<model value="override"/>-->
<!--<!– 用来进行去重的字段,在 程序中内置[_url,_page]两个字段,分别表示当前url,和当前页面 –>-->
<!--<!– field指的是配置的抓取字段名称,dbColumn表示映射在数据库的列名称 –>-->
<!--<distinct field="_url" dbColumn="url"/>-->
<!--<!– 是否自动建表 –>-->
<!--<autoCreateTable value="true"/>-->
<!--<!– 需要保存的字段, * 表示所有字段,_url:ur 表示将 抓取字段到数据库字段的映射 –>-->
<!--<needSaveFields value="_url:url,title,info,imgUrl"/>-->
<!--<!– 数据库驱动 –>-->
<!--<driver value="com.mysql.jdbc.Driver"/>-->
<!--<!– 数据库url –>-->
<!--<url value="jdbc:mysql://localhost/spider?useUnicode=true&characterEncoding=UTF-8" />-->
<!--<!– 数据库用户名 –>-->
<!--<user value="root"/>-->
<!--<!– 数据库密码 –>-->
<!--<password value="123456"/>-->
<!--<!– 数据库表名称 –>-->
<!--<tableName value="tb_douban"/>-->
<!--</jdbcPipeline>-->
<!-- csv管道 -->
<csvPipeline>
<!-- 写模式,目前支持 override 和 append,分别代表覆盖和追加 -->
<model value="override"/>
<charset value="gb2312" />
<!-- 用来进行去重的字段,非必须,在程序中内置[_url,_page]两个字段,分别表示当前url,和当前页面 -->
<distinct field="_url" csvHeader="url"/>
<!-- 需要保存的字段,*表示所有字段 -->
<needSaveFields value="title:电影标题,_url:url,dy:导演,bj:编剧,zy:主演,lx:类型,dq:地区,pc:片长,ym:别名,imdb,syrq:上映日期,imgUrl:封面地址,score:豆瓣评分,imgPath,abstract:简介"/>
<!-- 在爬虫任务终止时是否需要关闭csv文件,当任务为一次性时请设置为true,为调度任务时,设置为false -->
<closeAtTheEnd value="false" />
<!-- 保存的csv路径 -->
<path value="豆瓣电影.csv"/>
</csvPipeline>
</components>
<!-- 站点配置 -->
<site>
<!-- 浏览器标识 -->
<userAgent>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36</userAgent>
<!-- 请求头 -->
<headers>
<header key="Host" value="movie.douban.com" />
</headers>
<!-- cookie -->
<cookies>
<cookie key="bid" value="xYD83ezN29E"/>
<cookie key="gr_user_id" value="293a3df2-8d48-4e5b-8559-4f2b9084cd0b"/>
<cookie key="ll" value="118318"/>
<cookie key="__yadk_uid" value="y3wXc0nkdQ6WgQLoqigA5YsjTzM0jwj4"/>
<cookie key="viewed" value="1942934_24703171_2698938_20266642_1909003_5373022_6847455_6536593_1425950"/>
<cookie key=" ap" value="1"/>
</cookies>
</site>
<!-- 抓取字段配置 -->
<fields>
<field>
<!-- 字段名称 -->
<name>title</name>
<!--
属性scope取值为head,last,all;别表示:取第一个有效值;取最后一个有效值,取所有有效值。
-->
<scope>head</scope>
<!-- 抽取内容表达式,支持 xpath cssSelector;后续增加 jsonPath -->
<extract type="xpath" expression="//*div[@id='content']/h1/span[1]"/>
<!-- 是否将抽取后的数据格式化为纯文本(剔除html标签) -->
<textFormat>true</textFormat>
<!-- 是否为必须字段,当为true时,若该字段未抓取到值,不会被pipelne处理 -->
<must>true</must>
</field>
<field>
<name>info</name>
<extract type="xpath" expression="//*[@id='info']"/>
<textFormat>true</textFormat>
<must>true</must>
</field>
<field>
<name>imgUrl</name>
<extract type="xpath" expression="//*[@id='mainpic']/a/img/@src"/>
<textFormat>true</textFormat>
<must>true</must>
</field>
<field>
<name>score</name>
<extract type="xpath" expression="//*[@id='interest_sectl']//*[@class='ll rating_num']/text()"/>
<textFormat>false</textFormat>
<must>false</must>
</field>
<field>
<name>abstract</name>
<extract type="xpath" expression="//*[@id='link-report']//span//text()"/>
<textFormat>false</textFormat>
<must>false</must>
</field>
</fields>
</spider>
项目才刚刚开始,大家有什么建议和想法欢迎一起交流。同时也希望有兴趣和精力的盆友一起来完善这个项目
468248192
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。