Log4j错误
html
解决:在src目录下添加配置文件 log4j.propertiesgit
log4j.rootLogger=INFO, stdout, file log4j.logger.org.quartz=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%m%n log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=C:\\log4j\\webmagic\\webmagic.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%n%-d{MM-dd HH:mm:ss}-%C.%M()%n[%p]%m%n
协议错误,有的网站须要的SSL协议比较高,尽可能使用作高版本的jar包
github
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency>
状态码错误
web
解决:主要是与site有关,下边两种解决办法暂时还没弄明白apache
private Site site = Site .me() .setRetryTimes(3) .setSleepTime(3000) .setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0"); 或者 private Site site = Site .me() .setRetryTimes(3) .setSleepTime(3000) .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
缺乏HttpContext类
json
解决:添加HTTPContext的Jar包浏览器
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency>
在pom中引用jar包,引用完以后就基本好了app
<dependencies> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency> </dependencies>
参考博客:maven
参考博客:https://www.xttblog.com/?s=webmagic 其中有些案例,我没有运行成功,我会将我本身的案例发布上去(src/File目录下为正式爬取的案例,src/Test下的程序为学习过程当中找到的案例,也有本身测试的案例) 动态页面爬取参考 http://webmagic.io/docs/zh/posts/chx-cases/js-render-page.html Webmagic的使用说明 http://webmagic.io/docs/zh/
### 如何判断页面数据为经过js动态获取的???post
#### 判断页面是否为js渲染的方式比较简单,在浏览器中直接查看源码(Windows下Ctrl+U,Mac下command+alt+u),若是找不到有效的信息,则基本能够确定为js渲染。
Windows中按Ctrl+U,再按Ctrl+F查找其中的内容,我查找的是第一个游记,结果没有找到,这就断定该页面的数据是经过js动态获取的。
若是断定该页面的数据是经过JS动态获取的,就开始找获取数据的连接:例如:此时只有这几个请求,当点击第二页的时候,又出现了几个连接。
点击新出现的第一个连接,选择preview,出现返回的数据,从中找到详情页的连接。也能够直接复制这个连接,在新的标签页打开(https://you.autohome.com.cn/summary/getsearchresultlist?ps=20&pg=1&type=3&tagCode=&tagName=&sortType=3) 按照上边,一样的点击第三页也一样出现了一个新的请求连接https://you.autohome.com.cn/summary/getsearchresultlist?ps=20&pg=2&type=3&tagCode=&tagName=&sortType=3) 比较这两个连接,发现这两个连接只是pg这个参数不一样,根据这两个连接一个是第一页,一个是第二页,能够推测出每一个列表页的连接
若是在新的标签页打开(个人谷歌浏览器安装了一个JsonView插件,查看json格式的数据比较方便)
这里就有详情页的地址,咱们再看一下这个详情页的具体地址,连接后边的那个暂时不知道是什么用,大概只是一个标识做用,删去也能够访问,这样就能够根据上边的/details/112251拼接详情页的地址,这样知道了列表页的连接和详情的连接,就能够将这上面的游记都爬取下来了
当初我也就这样试了试,结果能爬下来,也就没管。可是后来查看这些游记,发现有的游记都只有一半,并不全,后来我又看网页,发现有的网页是只有一页(好比上边那个游记),有的网页有好几页(https://you.autohome.com.cn/details/112486#pvareaid=2174234),但时候后边附带着一个扩展全文的按钮,这时候就须要寻找全文的连接,不然爬取的只是一半的内容
单页面游记的随机数
获取这个随机数以后,就能够拼接这个完整页面的连接,而后将连接加入带爬取队列。而后就跟正常的爬取同样了
马蜂窝的爬取比较简单,只是最简单的列表页-详情页格式,只是在翻页的时候,页面只有5页,再看看每一个列表页的格式(https://www.mafengwo.cn/yj/21536/1-0-2.html) 只是最后的数不一样,应该就是表明页数。经过循环拼接连接,并将连接加入带爬取队列
可是这里有一个问题尚未解决:马蜂窝的游记都比较长,为了快速加载,每一个游记都是分红几回加载,好比刚打开页面的时候,只是显示上边的一部分,当下滑到最下边的时候,就会JS请求继续获取下边的页面
当随着下滑,会加载出剩下的页面数据
携程旅游也是一个动态获取的页面,只不过他的动态获取只是翻页的时候的列表页是动态获取的,具体的详情页是正常的。因此只要获取翻页的连接就跟正常的列表-详情页的爬取是同样的了。
这个网站没有具体的翻页按钮,每次向下滑动页面,就会动态加载下一页的游记列表
这样就找到了翻页的连接 (http://you.ctrip.com/TravelSite/Home/IndexTravelListHtml?p=2&Idea=0&Type=100&Plate=0), 根据上边的连接发现只有那个p属性不一样,应该是是表明页数。拼接这个连接,加入带爬取队列就能够了
GitHub地址 https://github.com/zhangHaoNiHao/WebMagic