httpclient 抓取网页(如何使用Java/Python访问网页和使用Python进行数据解析)
优采云 发布时间: 2021-11-26 19:03httpclient 抓取网页(如何使用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下编码,那么你可以参考: