网页爬虫

yxysuanfa yxysuanfa     2022-09-04     416

关键词:

 一. 前言 


  近期要測试改动一个反爬虫代码, 之前一直没接触过反爬虫, 仅仅闻其声不见其人。 


  既然要反爬虫。 肯定要理解爬虫的思维方式, 见招拆招, 只是遗憾的是仅仅要你想爬没啥爬不到的, 比方控制下爬取频率, 用无数个代理小量多次爬取, 反爬虫仅仅能说是尽量添加一些爬取的门槛吧, 至少把一些练手的小爬虫(比方如今这个小菜鸡爬虫)挡在外面。 降低些负载。



二. 设计思路


(1)一个收集所需网页全站或者指定子域名的链接队列

(2)一个存放将要訪问的URL队列(跟上述有点反复, 用空间换时间。 提升爬取速度)

(3)一个保存已訪问过URL的数据结构


数据结构有了, 接下来就是算法了, 一般推荐採取广度优先的爬取算法, 免得中了反爬虫的某些循环无限深度的陷阱。


使用了 jsoup (一个解析HTML元素的Lib)和 httpclient (网络请求包)来简化代码实现。



三. 代码实现


上述三种数据结构:

// 已爬取URL  <URL, isAccess>
    final static ConcurrentHashMap<String, Boolean> urlQueue = new ConcurrentHashMap<String, Boolean>();

    // 待爬取URL
    final static ConcurrentLinkedDeque<String> urlWaitingQueue = new ConcurrentLinkedDeque<String>();

    // 待扫描网页URL队列
    final static ConcurrentLinkedDeque<String> urlWaitingScanQueue = new ConcurrentLinkedDeque<String>();


入队等待:

/**
     * url store in the waiting queue
     * @param originalUrl
     * @throws Exception
     */
    private static void enterWaitingQueue(final String originalUrl) throws Exception{

        String url = urlWaitingScanQueue.poll();

        // if accessed, ignore the url
        /*while (urlQueue.containsKey(url)) {
            url = urlWaitingQueue.poll();
        }*/

        final String finalUrl = url;

        Thread.sleep(600);

        new Thread(new Runnable() {

            public void run() {

                try{

                    if (finalUrl != null) {

                        Connection conn = Jsoup.connect(finalUrl);
                        Document doc = conn.get();

                        //urlQueue.putIfAbsent(finalUrl, Boolean.TRUE); // accessed

                        logger.info("扫描网页URL: " + finalUrl);

                        Elements links = doc.select("a[href]");

                        for (int linkNum = 0; linkNum < links.size(); linkNum++) {
                            Element element = links.get(linkNum);

                            String suburl = element.attr("href");

                            // 某条件下, 而且原来没訪问过
                            if (!urlQueue.containsKey(suburl)) {

                                    urlWaitingScanQueue.offer(suburl);
                                    urlWaitingQueue.offer(suburl);
                                    logger.info("URL入队等待" + linkNum + ": " + suburl);
                                }
                            }

                        }

                    }

                } catch (Exception ee) {
                    logger.error("muti thread executing error, url: " + finalUrl, ee);
                }

            }
        }).start();
    }


訪问页面:

private static void viewPages() throws Exception{

        Thread.sleep(500);

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {

                    while(!urlWaitingQueue.isEmpty()) {

                        String url = urlWaitingQueue.peek();

                        final String finalUrl = url;

                        // build a client, like open a browser
                        CloseableHttpClient httpClient = HttpClients.createDefault();

                        // create get method, like input url in the browser
                        //HttpGet httpGet = new HttpGet("http://www.dxy.cn");
                        HttpPost httpPost = new HttpPost(finalUrl);

                        StringBuffer stringBuffer = new StringBuffer();
                        HttpResponse response;


                        //List<NameValuePair> keyValue = new ArrayList<NameValuePair>();

                        //  Post parameter
                        //            keyValue.add(new BasicNameValuePair("username", "zhu"));
                        //
                        //            httpPost.setEntity(new UrlEncodedFormEntity(keyValue, "UTF-8"));


                        // access and get response
                        response = httpClient.execute(httpPost);

                        // record access URL
                        urlQueue.putIfAbsent(finalUrl, Boolean.TRUE);

                        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                            HttpEntity httpEntity = response.getEntity();
                            if (httpEntity != null) {
                                logger.info("viewPages訪问URL:" + finalUrl);
                                BufferedReader reader = new BufferedReader(
                                        new InputStreamReader(httpEntity.getContent(), "UTF-8"));

                                String line = null;
                                if (httpEntity.getContentLength() > 0) {

                                    stringBuffer = new StringBuffer((int) httpEntity.getContentLength());

                                    while ((line = reader.readLine()) != null) {
                                        stringBuffer.append(line);
                                    }

                                    System.out.println(finalUrl + "内容: " + stringBuffer);
                                }
                            }

                        }

                    }


                } catch (Exception e) {
                    logger.error("view pages error", e);
                }
            }

        }).start();


    }



三. 总结及将来要实现功能


以上贴出了简易版Java爬虫的核心实现模块, 基本上拿起来就能測试。


比方前言所提到的控制爬取速度(调度模块), 使用代理IP訪问(收集网络代理模块)的实如今兴许版本号中会慢慢加上...





网络爬虫

...       网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从... 查看详情

网页爬虫

 一.前言  近期要測试改动一个反爬虫代码,之前一直没接触过反爬虫,仅仅闻其声不见其人。  既然要反爬虫。肯定要理解爬虫的思维方式,见招拆招,只是遗憾的是仅仅要你想爬没啥爬不到的,比方控制下... 查看详情

java爬虫系列——爬取动态网页

java爬虫系列(二)——爬取动态网页Mr_OOO 2018-01-0115:59:40  11440  收藏 11分类专栏: 爬虫 入门专栏 最简单的java爬虫 文章标签: java 爬虫 seimiagent seimicrawler动态网页版权&nbs 查看详情

学习爬虫前对网页进行认识

前言  首先我们提到爬虫,我们不得不说网页,因为我们使用python编写的爬虫实际上是针对于网页进行设计的,解析网页以及抓取这些数据是爬虫需要做的事情,日常中我们看到这些网页,可以看到很多图片,很多的标题以及... 查看详情

网页爬虫:零基础用爬虫爬取网页内容

网络上有许多用Python爬取网页内容的教程,但一般需要写代码,没有相应基础的人要想短时间内上手,还是有门槛的。其实绝大多数场景下,用WebScraper(一个Chrome插件)就能迅速爬到目标内容,重要的... 查看详情

爬虫相关

网络爬虫:就是抓取网页数据的程序。网页三大特征:1.网页都有自己的URL(统一资源定位符)来进行定位,每个网页都有一个唯一的URL2.网页都用HTML(超文本标记语言)来描述页面信息。3.网页都用HTTP/HTTPS(超文本传输协议)... 查看详情

网页爬虫之二手车价格爬虫(代码片段)

今天学习了爬虫技术简单来说就是利用pyhon连续的访问网页,自动的将网页中我们用到的信息存储起来的过程。需要我们的看懂简单的网页代码,能够写一些简单的python语句下面我们举一个一个需要两步爬虫的例子:... 查看详情

网页爬虫之二手车价格爬虫(代码片段)

今天学习了爬虫技术简单来说就是利用pyhon连续的访问网页,自动的将网页中我们用到的信息存储起来的过程。需要我们的看懂简单的网页代码,能够写一些简单的python语句下面我们举一个一个需要两步爬虫的例子:... 查看详情

初识爬虫

何为爬虫  网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。  我们平时的上网就是浏览器提交请求->下载网页代... 查看详情

最基础网页爬虫

第一个网页文本爬虫程序(没有添加下载器):1importrequests2frombs4importBeautifulSoup3importos45headers={‘User-Agent‘:"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTMl,likeGecko)Chrome/22.0.1207.1Safari/537.1"}6url_b 查看详情

爬虫开坑之路

...一种用来自动浏览万维网的网络机器人(bots)。爬虫是通过网页的链接地址来寻找网页,从网站某一个页面开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到... 查看详情

9.3.2网页爬虫(代码片段)

  网页爬虫常用来在互联网上爬取感兴趣的页面或文件,结合数据处理与分析技术可以得到更深层次的信息。下面的代码实现了网页爬虫,可以抓取指定网页中的所有链接,并且可以指定关键字和抓取深度。 1importsys2importm... 查看详情

爬虫简介(代码片段)

...载数据或者内容能自动在网络上流窜爬虫的三大步骤下载网页提取正确的信息根据一定的规则自动跳到另外的网页上执行上两步爬虫的分类通用爬虫专用爬虫(聚焦爬虫)爬虫的结构Python爬虫架构主要由五个部分组成,分别是调... 查看详情

网络爬虫之网页排重:语义指纹

引言:网络爬虫让我们高效地从网页获取到信息,但网页的重复率很高,网页需要按内容做文档排重,而判断文档的内容重复有很多种方法,语义指纹是其中比较高效的方法。本文选自《网络爬虫全解析——技术、原理与实践》... 查看详情

网页爬虫

importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pa 查看详情

论坛标题网页爬虫

】论坛标题网页爬虫【英文标题】:Forumtitlewebscraper【发布时间】:2017-01-0402:26:50【问题描述】:我正在编写一个简单的网络爬虫,它可以从论坛中提取帖子标题、用户名和上次发帖时间。问题是刮板只提取表中的最后一个条目... 查看详情

爬虫抓取网页来下载小说

利用Python3编写爬虫,从笔趣阁抓个小说下载。importreimporturllib.requestimporttimeimporteasyguiasg#输入地址g.msgbox("利用Python3编写爬虫,从笔趣阁抓个小说下载到手机查看")msg="输入小说地址,例如http://www.biquge.com.tw/0_213/"title=‘爬虫‘root=... 查看详情

java网络爬虫获取网页源代码原理及实现

Java网络爬虫获取网页源代码原理及实现  1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过... 查看详情