java从网页抓取数据(如何使用Java/Python访问网页和使用Python进行数据解析)

优采云 发布时间: 2022-01-09 19:05

  java从网页抓取数据(如何使用Java/Python访问网页和使用Python进行数据解析)

  前言:

  网络爬虫看起来仍然很棒。但是,如果您考虑一下,或进行一些研究,您就会知道爬行动物并没有那么先进。最深刻的就是当我们的数据量很大的时候,也就是当我们的网络“图”中的循环越来越多的时候,如何解决。

  这篇文章文章只是在这里起到一个引导的作用。本文主要讲解如何使用Java/Python访问网页并获取网页代码,Python模仿浏览器访问网页,使用Python进行数据分析。希望我们能从这篇文章开始,一步步揭开网络蜘蛛的神秘面纱。

  参考:

  1.《编写你自己的网络爬虫》

  2.用python编写爬虫爬取csdn内容,完美解决403 Forbidden

  运行效果图:

  

  内容很多,我只选了一部分展示。

  作者环境:

  系统:Windows 7

  CentOS 6.5

  运行环境:JDK1.7

  Python 2.6.6

  IDE:EclipseRelease 4.2.0

  PyCharm 4.5.1

  数据库:MySQLVer 14.14 Distrib 5.1.73

  开发过程:1.使用Java爬取页面

  对于页面抓取我们使用Java来实现,当然你也可以使用其他语言来开发。但

  下面以“博客园”首页为例,展示使用Java进行网页爬取的过程:

  public class RetrivePageSimple {

private static HttpClient httpClient = new HttpClient();

// 设置代理服务器

static {

httpClient.getHostConfiguration().setProxy("58.220.2.132", 80);

}

public static boolean downloadPage(String path) throws HttpException,

IOException {

PostMethod postMethod = new PostMethod(path);

// 执行,返回状态码

int statusCode = httpClient.executeMethod(postMethod);

System.out.println(statusCode);

// 针对状态码进行处理 (简单起见,只处理返回值为200的状态码)

if (statusCode == HttpStatus.SC_OK) {

String a = postMethod.getResponseBodyAsString();

System.out.println(a);

return true;

}

return false;

}

public static void main(String[] args) {

try {

RetrivePageSimple.downloadPage("http://www.cnblogs.com/");

} catch (HttpException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

  结果信息在这里不再显示,太多了。. . - -!

  2.使用 Python 抓取页面

  可能你会问我,为什么写成使用Java版的页面爬取,而这里又是一个Python?这是必要的。因为作者在开发这个demo之前没有考虑问题。当我们使用Java爬取网页到Python时,网页字符串太长无法作为参数传递。您可能认为保存文件是一个不错的选择,但是如果 html 文件过多怎么办?是的,在这里我们必须放弃这种累人的做法。

  考虑到参数长度的限制,这里只给出Java端的页面地址,使用Python爬取网页。

  以最简单的方式,我们通常使用这样的 Python 网页:

  import urllib2

result = urllib2.urlopen('http://blog.csdn.net/mobile/index.html')

html = result.read()

print html

  但是作者的代码使用的是CSDN博客频道的url。CSDN 过滤来自爬虫的访问。如下,我们会得到如下错误信息:

  

  403,我被拒绝了。

  3.使用模拟浏览器登录网站

  如前所述,当我们访问一个带有保护措施的网页时,它会被拒绝。但是我们可以尝试使用我们自己的浏览器来访问它,它是可以访问的。

  也就是说,如果我们能在 Python 中把自己模仿成一个浏览器,就可以访问这个网页。这是在 Python 中模仿浏览器的代码:

  import random

import socket

import urllib2

import cookielib

ERROR = {

'0':'Can not open the url,checck you net',

'1':'Creat download dir error',

'2':'The image links is empty',

'3':'Download faild',

'4':'Build soup error,the html is empty',

'5':'Can not save the image to your disk',

}

class BrowserBase(object):

def __init__(self):

socket.setdefaulttimeout(20)

self._content = None

def speak(self, name, content):

print '[%s]%s' % (name, content)

def open_url(self, url):

"""

打开网页

"""

cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())

self.opener = urllib2.build_opener(cookie_support,urllib2.HTTPHandler)

urllib2.install_opener(self.opener)

user_agents = [

'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',

'Opera/9.25 (Windows NT 5.1; U; en)',

'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',

'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',

'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',

'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',

"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",

"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 ",

]

agent = random.choice(user_agents)

self.opener.addheaders = [("User-agent", agent), ("Accept", "*/*"), ('Referer', 'http://www.google.com')]

try:

res = self.opener.open(url)

self._content = res.read()

# print self._content

except Exception, e:

self.speak(str(e)+url)

raise Exception

else:

return res

def get_html_content(self):

return self._content

def get_html_response(html):

spider = BrowserBase()

spider.open_url(html)

return spider.get_html_content()

  以上代码可以正常获取返回值。下面我们来看看返回结果的解析过程。

  4.数据分析

  使用 Python 解析 Html 异常简单:

  import HTMLParser

class ListWebParser(HTMLParser.HTMLParser):

def __init__(self):

HTMLParser.HTMLParser.__init__(self)

self.tagDIVFlag = False

self.tagDIVAFlag = False

self.tagH1Flag = False

self.tagSecondHrefFlag = False

self._name = None

self._address = None

def handle_starttag(self, tag, attrs):

if tag == 'div':

for name, value in attrs:

if name == 'class' and value == 'blog_list':

self.tagDIVFlag = True

if tag == 'h1':

if self.tagDIVFlag:

self.tagH1Flag = True

# print 'h1->', self.tagH1Flag

if tag == 'a':

#if self.tagDIVAFlag:

#print 'h1: ', self.tagH1Flag

if self.tagH1Flag:

for name, value in attrs:

if name == 'target' and value == '_blank':

self.tagDIVAFlag = True

if name == 'href':

if self.tagSecondHrefFlag:

print '网址:', value

self._address = value

self.tagSecondHrefFlag = True

# if name == 'href' and self.tagDIVAFlag:

# print '网址:', value

# self._address = value

def handle_endtag(self, tag):

if tag == 'div':

self.tagDIVFlag = False

if tag == 'h1':

self.tagH1Flag = False

# print 'false h1.'

if tag == 'a':

self.tagDIVAFlag = False

def handle_data(self, data):

if self.tagDIVAFlag:

print u"名称:", data.decode("utf-8")

  如果你说你在网上找到的Html文件没有这个麻烦。我承认这一点,因为在正常情况下,我们解析一些简单的数据真的很简单。上面代码中的复杂逻辑是处理过滤。

  说到过滤,我这里用了一个小技巧(当然,当更多的人使用它时,这不再只是一个技巧。但是,这种方法可以在以后的编码过程中进行参考)。我们通过标签的一些特殊属性(例如:id、class等)来锁定块。当我们开始block时,我们对应的flag会被标记为True,当我们退出block时,我们对应的flag会被标记为False。也许你认为这太麻烦了。其实,如果你仔细想想,你会发现它是有道理的。

  预防措施:

  1.当使用 Java 进行网页抓取时,我们使用代理服务器。这个代理服务器的主机和端口可以直接在网上免费查到。

  2.你需要准备以下jar包并导入到你的Eclipse项目中:

  

  3.修改MySQL默认编码为UTF-8

  因为这里会有一些中文信息,所以我们需要转换MySQL的编码格式。

  如果你是在Linux下编码,那么你可以参考:

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线