Com base nos links para o site de destino, este artigo aumenta ainda mais a dificuldade, captura o conteúdo de que precisamos na página de destino e o salva no banco de dados. O caso de teste aqui usa um site de download de filmes que eu costumo usar (http://www.80s.la/). Originalmente, eu queria rastejar todos os links de download de filmes no site, mas depois senti que demorou muito, então mudei para rastejar os links para download do filme de 2015.
Introdução ao primeiro princípio
De fato, os princípios são semelhantes ao primeiro artigo. A diferença é que, como existem muitas listas de classificação neste site, é inimaginável se essas tags não forem escolhidas.
Você não precisa usar links de categoria ou tags. Você não usa esses links para rastejar outras páginas. Você só pode obter a lista de filmes de outras páginas através da paginação de todos os tipos de filmes na parte inferior da página. Ao mesmo tempo, para a página de detalhes do filme, você apenas engana o título do filme e os links do Thunder Download, e não rasteja em profundidade. Você não precisa de filmes recomendados e outros links na página de detalhes.
Por fim, salve os links de download de todos os filmes obtidos na coleção VideolinkMap e salve os dados no MySQL, atravessando esta coleção.
Implementação de dois códigos
O princípio da implementação foi mencionado acima e há comentários detalhados no código, então não vou falar sobre isso aqui, o código é o seguinte:
Ação do pacote de pacote Java.io.BufferedReader; importar java.io.ioException; importar java.io.inputStream; importar java.io.inputStreamReader; importar java.net.httpurlconnection; import java.net.malformException; java.SQL.PreparedStatement; importar java.sql.sqLexception; importar java.util.linkedhashmap; importar java.util.map; importar java.util.regex.matcher; importar java.util.regex.pattern; classe pública videolinkgrab {public static void main (string [] args) {videolinkgrab videolinkgrab = new videolinkgrab (); videolinkgrab.savedata ("http://www.80s.la/movie/list/-2015-----P"); } / ** * Salvar os dados recuperados no banco de dados * * @param baseurl * ponto de partida do crawler * @return null * * / public void savedata (string baseurl) {map <string, boolean> Oldmap = new LinkedHashmap <string, boolean> (); // armazenar link-is it perseguido por mapa <string, string> videolinkMap = new LinkedHashmap <string, string> (); // Download de vídeo Link String OldLinkHost = ""; // Padrão do host P = Pattern.compile ("(https?: //)? [^/// s]*"); // por exemplo: http://www.zifangsky.cn Matcher M = P.Matcher (Baseurl); if (m.find ()) {OldLinkHost = m.Group (); } oldmap.put (baseurl, false); videolinkMap = Crawllinks (OldLinkhost, Oldmap); // atravessar e salvar os dados no banco de dados, tente {conexão conexão = jdbcdemo.getConnection (); para (map.entry <string, string> mapeamento: videolinkmap.entryset ()) {preparado pstatement = conexão .Preparestatement ("inserir no filme (moviename, moviielink) valores (?,?)"); pstatement.SetString (1, mapping.getKey ()); pstatement.SetString (2, mapping.getValue ()); pstatement.executeUpdate (); pstatement.close (); // System.out.println (mapping.getKey () + ":" + mapping.getValue ()); } conexão.close (); } catch (sqLexception e) {e.printStackTrace (); }} /*** Rastreie todos os links da página da web que podem ser rastreados em um site. Na idéia, o algoritmo de amplitude de prioridade é usado para iniciar continuamente as solicitações GET de novos links que não foram atravessados. Até que o conjunto completo seja atravessado, nenhum novo link pode ser encontrado*, o que significa que novos links não podem ser encontrados. A tarefa termina * * Ao fazer uma solicitação de um link, use pesquisas regulares para o link de vídeo que precisamos para a página da web e salve -o na coleção VideOLinkMap * * @param OldLinkhost * Nome de domínio, como: Http Link a ser liberado Crawllinks (String OldLinkhost, mapa <string, boolean> Oldmap) {map <string, boolean> newmap = new LinkedHashmap <string, boolean> (); // novo link obtido de cada mapa de loop <string, string> videolinkMap = new LinkedHashmap <string, string> (); // Download de vídeo Link String OldLink = ""; para (map.entry <string, boolean> mapeamento: oldmap.entryset ()) {// System.out.println ("link:" + mapping.getKey () + "-------- Verifique:" // + mapping.getValue ()); // se não tiver sido atravessado por (! // inicia uma solicitação de get tente {url url = new url (OldLink); Conexão httpurlConnection = (httpurlConnection) url .openconnection (); Connection.SetRequestMethod ("Get"); Connection.setConnectTimeout (2500); Connection.SetReadTimeout (2500); if (Connection.GetRESPONSecode () == 200) {inputStream inputStream = conexão.getInputStream (); BUBLEREDREADER LEITOR = NEW BUBLESEDRADER (new InputStreamReader (InputStream, "UTF-8")); String line = ""; Padrão padrão = nulo; Matcher Matcher = NULL; // Página de detalhes do filme, retire o link de download de vídeo e não continue rastejando outras páginas em profundidade se (ismoviepage (OldLink)) {boolean checkTitle = false; String title = ""; while ((line = reader.readline ())! = null) {// Recupere o título de vídeo na página if (! checktitle) {padrony = padring.compile ("([^// s]+).*? </ititure>"); Matcher = Pattern.Matcher (linha); if (matcher.find ()) {title = Matcher.group (1); checktitle = true; continuar; }} // Remova o link de download de vídeo no padrão da página = padrão .compile ("(Thunder: [^/"]+).*Thunder [rr] es [tt] itle =/"[^/"]*/""); Matcher = Pattern.Matcher (linha); if (matcher.find ()) {videolinkmap.put (título, matcher.group (1)); System.out.println ("Nome do vídeo:" + title + "------ Link de vídeo:" + Matcher.group (1)); quebrar; // A página atual foi detectada}}} // A página da lista de filmes se (checkurl (OldLink)) {while ((line = reader.readLine ())! = Null) {padrony = padring .compile ("<a href =/" ([^/// s]*)/""); matther = href =/"([^/"/s]*)/""); Matcher.Group (1) .Trim (); (newlink.endswith ("/")) newlink = newlink.substring (0, newlink.length () - 1); System.Println (temp: "Newlink); } tente {thread.sleep (1000); } catch (interruptedException e) {e.printStackTrace (); } oldmap.replace (OldLink, false, verdadeiro); }} // Há um novo link, continue a atravessar se (! Newmap.isempty ()) {Oldmap.putall (newmap); videolinkmap.putall (Crawllinks (OldLinkhost, Oldmap)); // Devido às características do mapa, os pares duplicados de valor-chave não ocorrerão} retornará o VideOLinkMap; }/** * Julgue se é uma página de lista de filmes de 2015 * @param url url a ser verificado * @return status * */public boolean checkurl (string url) {padrony padrony = padring.compile ("http://www.80s.la/movie/list/-2015----p/d*"); Matcher Matcher = Pattern.Matcher (URL); if (matcher.find ()) retorna true; // Lista de 2015 mais retornar false; }/** * Julgue se a página é uma página de detalhes do filme * @param url link * @return status * */public boolean ismoviepage (string url) {padrony padring = padring.compile ("http://www.80s.la/movie//d+"); Matcher Matcher = Pattern.Matcher (URL); if (matcher.find ()) retorna true; // página de filme mais retorna falsa; }} Nota: Se você deseja engatinhar algum conteúdo especificado de outros sites, precisará modificar algumas das expressões regulares razoavelmente de acordo com a situação real.
Três resultados de teste
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.