
html代码
PHP写微信公众号文章页采集方法
采集交流 • 优采云 发表了文章 • 0 个评论 • 429 次浏览 • 2020-07-24 08:04
另外注意:这个匹配规则会可能在一段时间以后有变化。这篇文章会尽量保持更新。如果你按照我的文章制作了采集系统以后,当某三天失效了,别忘了回去再瞧瞧文章是否有更新。
2)内容处理:
通过前面的方式我们获得了文章内容的html,但是你将文章内容显示下来以后才会发觉,图片和视频不能正常显示。因为这个html还须要一些加工:
首先是图片,微信文章中的标签中的src属性全部都用了data-src属性替代。只有在显示的时侯就会被替换过来。所以我们也有两个方案,将源代码直接替换过来,或者用js在显示时侯再替换。下面我先介绍直接替换html的方式:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("data-src","src",$content);
然后是视频,视频的显示不正常,经过常年测试后发觉只要替换一个页面地址才能解决,过程就不说了,直接说结果:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("preview.html","player.html",$content);
通过这两个替换过后,文章内容html中的图片和视频就都正常了。
3) 公众号相关信息:
通过本专栏之前的文章,介绍了我们使用陌陌客户端,任意打开一个公众号的历史消息页以后。系统从数据库中辨识biz的值,发现数据库中没有记录,就会插入一条新的纪录。之后的采集队列都会定期按照这个biz来获取这个公众号的历史消息列表。
但是我们只获得了这个公众号的biz,公众号的名称,头像这两个重要信息还是没有获取到。主要诱因是历史消息页面中没有这两个信息。但是我们可以从文章页面中获取到。
在陌陌文章页面html的顶部,有一些js的变量形参的代码,通过正则匹配然后我们就可以获得这两个公众号的信息:
1
2
3
4
5
6
7
//$html变量的值是上面获取到的文章全部html
preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
$nickname = $m[1][0];//公众号爱称
preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
$head_img = $m[1][0];//公众号头像
通过这两个正则匹配,我们才能获取到公众号的头像和爱称,然后按照文章地址中的biz,可以保存到对应的微信号数据表中。
3、文章的保存和处理
前面的代码已然将文章内容获取到变量中了。如何保存虽然每个人似乎都有自己的看法。我这儿介绍一下我的保存内容的方式:
将文章内容的html以数据库id为文件名保存成html文件,以biz数组为目录。
1
2
3
4
5
6
7
8
9
10
11
$dir = "./".$biz."/";
$filename = $dir.$id.".html";
if(!is_dir($dir)) {
mkdir($cache_dir);
chmod($cache_dir,0777);
}
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
以上代码是一个标准的php构建文件夹保存文件的代码,大家可以依照自己的实际情况安排保存方式。
在这以后我们就可以在自己的服务器上得到一个html文件,内容就是公众号的文章内容。我们可以从浏览器中打开看一下。这时你或许会发觉图片防盗链了!无法正常显示!包括数据库中保存的文章封面图,公众号的头像都是防盗链的。
别急,这个问题挺好解决,只须要将图片也保存到自己的服务器,无非是将来会占用自己的服务器空间和带宽。
图片防盗链的原理是当图片在网页中显示的时侯php 采集微信文章图片,图片服务器会测量到引用这张图片的服务器域名,当发觉服务器域名不包含或的时侯才会被替换成防盗链图片。
但是假若测量不到引用页面的域名才会正常显示,所以我们通过php的函数file_get_content()就可以将图片的二进制代码获取过来,然后按照自己的看法起个文件名保存到自己的服务器上。在这里再介绍一个保存图片的方式,我目前使用了腾讯云的“万象优图”,通过它们提供的api将图片保存到云空间,这样的用处是读取图片时直接在图片的链接地址加上希望得到的图片规格大小参数,就可以直接得到一张缩略图。比存在自己的服务器便捷得多。阿里云也应当有同样的产品php 采集微信文章图片,好像名叫对象储存。
另外,我采集公众号内容的目的是制做成一个新闻app,在app上将html代码显示下来以后,因为app同样没有域名,防盗链服务器也同样不会觉得图片被盗链了。这样就可以直接显示图片下来。 查看全部
另外注意:这个匹配规则会可能在一段时间以后有变化。这篇文章会尽量保持更新。如果你按照我的文章制作了采集系统以后,当某三天失效了,别忘了回去再瞧瞧文章是否有更新。
2)内容处理:
通过前面的方式我们获得了文章内容的html,但是你将文章内容显示下来以后才会发觉,图片和视频不能正常显示。因为这个html还须要一些加工:
首先是图片,微信文章中的标签中的src属性全部都用了data-src属性替代。只有在显示的时侯就会被替换过来。所以我们也有两个方案,将源代码直接替换过来,或者用js在显示时侯再替换。下面我先介绍直接替换html的方式:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("data-src","src",$content);
然后是视频,视频的显示不正常,经过常年测试后发觉只要替换一个页面地址才能解决,过程就不说了,直接说结果:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("preview.html","player.html",$content);
通过这两个替换过后,文章内容html中的图片和视频就都正常了。
3) 公众号相关信息:
通过本专栏之前的文章,介绍了我们使用陌陌客户端,任意打开一个公众号的历史消息页以后。系统从数据库中辨识biz的值,发现数据库中没有记录,就会插入一条新的纪录。之后的采集队列都会定期按照这个biz来获取这个公众号的历史消息列表。
但是我们只获得了这个公众号的biz,公众号的名称,头像这两个重要信息还是没有获取到。主要诱因是历史消息页面中没有这两个信息。但是我们可以从文章页面中获取到。
在陌陌文章页面html的顶部,有一些js的变量形参的代码,通过正则匹配然后我们就可以获得这两个公众号的信息:
1
2
3
4
5
6
7
//$html变量的值是上面获取到的文章全部html
preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
$nickname = $m[1][0];//公众号爱称
preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
$head_img = $m[1][0];//公众号头像
通过这两个正则匹配,我们才能获取到公众号的头像和爱称,然后按照文章地址中的biz,可以保存到对应的微信号数据表中。
3、文章的保存和处理
前面的代码已然将文章内容获取到变量中了。如何保存虽然每个人似乎都有自己的看法。我这儿介绍一下我的保存内容的方式:
将文章内容的html以数据库id为文件名保存成html文件,以biz数组为目录。
1
2
3
4
5
6
7
8
9
10
11
$dir = "./".$biz."/";
$filename = $dir.$id.".html";
if(!is_dir($dir)) {
mkdir($cache_dir);
chmod($cache_dir,0777);
}
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
以上代码是一个标准的php构建文件夹保存文件的代码,大家可以依照自己的实际情况安排保存方式。
在这以后我们就可以在自己的服务器上得到一个html文件,内容就是公众号的文章内容。我们可以从浏览器中打开看一下。这时你或许会发觉图片防盗链了!无法正常显示!包括数据库中保存的文章封面图,公众号的头像都是防盗链的。
别急,这个问题挺好解决,只须要将图片也保存到自己的服务器,无非是将来会占用自己的服务器空间和带宽。
图片防盗链的原理是当图片在网页中显示的时侯php 采集微信文章图片,图片服务器会测量到引用这张图片的服务器域名,当发觉服务器域名不包含或的时侯才会被替换成防盗链图片。
但是假若测量不到引用页面的域名才会正常显示,所以我们通过php的函数file_get_content()就可以将图片的二进制代码获取过来,然后按照自己的看法起个文件名保存到自己的服务器上。在这里再介绍一个保存图片的方式,我目前使用了腾讯云的“万象优图”,通过它们提供的api将图片保存到云空间,这样的用处是读取图片时直接在图片的链接地址加上希望得到的图片规格大小参数,就可以直接得到一张缩略图。比存在自己的服务器便捷得多。阿里云也应当有同样的产品php 采集微信文章图片,好像名叫对象储存。
另外,我采集公众号内容的目的是制做成一个新闻app,在app上将html代码显示下来以后,因为app同样没有域名,防盗链服务器也同样不会觉得图片被盗链了。这样就可以直接显示图片下来。
【原创源码】网络爬虫
采集交流 • 优采云 发表了文章 • 0 个评论 • 324 次浏览 • 2020-07-02 08:01
最近因为女朋友工作需求,需要获取各大团购网站上的店家信息,这样自动一个一个点不得气死,于是我就写了一个网络爬虫来解决这个问题,是用java写的,主要用到了两个开源库,httpclient和jsoup...用来获取网页数据和得到想要的数据,不过最好是有点web基础网络爬虫代码,这样就可以只要想要的值,不然会有很多没用的数据,后期还要自动删掉,比较麻烦...下面附上源码和说明...
[Asm] 纯文本查看 复制代码
public static String getHtmlByUrl(String url){
String html = null;
HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象
HttpGet httpget = new HttpGet(url);//以get方式请求该URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce对象
int resStatu = responce.getStatusLine().getStatusCode();//返回码
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不对
//获得相应实体
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//获得html源代码
InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("访问【"+url+"】出现异常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
}
上面的就是httpclient库的内容,用它来获取html页面的数据
[Java] 纯文本查看 复制代码
public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要获取数据的网址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基础的话,可以设置一下这里,知道自己想要的数据
for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
这个就是解析获取来的html数据,找到自己想要的数据....
然后把取到的数据存入excel获取txt里就随大伙便了,不过这个方式有一个漏洞就是,只能取静态页面,动态页面未能实现,我还要再继续研究一下,研究下来了,再发下来,如果有哪些不懂的网络爬虫代码,可以问我,知道的一定告诉你们,希望你们多评分,多鼓励,非常谢谢!!!! 查看全部

最近因为女朋友工作需求,需要获取各大团购网站上的店家信息,这样自动一个一个点不得气死,于是我就写了一个网络爬虫来解决这个问题,是用java写的,主要用到了两个开源库,httpclient和jsoup...用来获取网页数据和得到想要的数据,不过最好是有点web基础网络爬虫代码,这样就可以只要想要的值,不然会有很多没用的数据,后期还要自动删掉,比较麻烦...下面附上源码和说明...
[Asm] 纯文本查看 复制代码
public static String getHtmlByUrl(String url){
String html = null;
HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象
HttpGet httpget = new HttpGet(url);//以get方式请求该URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce对象
int resStatu = responce.getStatusLine().getStatusCode();//返回码
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不对
//获得相应实体
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//获得html源代码
InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("访问【"+url+"】出现异常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
}
上面的就是httpclient库的内容,用它来获取html页面的数据
[Java] 纯文本查看 复制代码
public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要获取数据的网址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基础的话,可以设置一下这里,知道自己想要的数据
for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
这个就是解析获取来的html数据,找到自己想要的数据....
然后把取到的数据存入excel获取txt里就随大伙便了,不过这个方式有一个漏洞就是,只能取静态页面,动态页面未能实现,我还要再继续研究一下,研究下来了,再发下来,如果有哪些不懂的网络爬虫代码,可以问我,知道的一定告诉你们,希望你们多评分,多鼓励,非常谢谢!!!!
java实现一个简单的网路爬虫代码示例
采集交流 • 优采云 发表了文章 • 0 个评论 • 276 次浏览 • 2020-05-15 08:01
这篇文章主要介绍了java实现一个简单的网路爬虫代码示例,还是挺不错的,这里分享给你们,需要的同学可以参考下。
目前市面上流行的爬虫以python居多,简单了解过后网络爬虫代码,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想网络爬虫代码,java有没有用户便捷解析html页面呢?找到了一个jsoup包,一个十分便捷解析html的工具呢。
使用方法也十分简单,引入jar包:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
使用http工具,请求获取目标页面的整个html页面信息,然后使用jsoup解析:
//获取html页面信息
String html = getHtml();
//使用jsoup将html解析为Document对象
Document doc = Jsoup.parse(html);
//后续操作就可以解析这个DOM树了,非常简单。
总结
以上就是本文关于java实现一个简单的网路爬虫代码示例的全部内容,希望对你们有所帮助。感兴趣的同学可以继续参阅本站: 查看全部
更新时间:2017年11月13日 08:50:04 作者:在远行的路上
这篇文章主要介绍了java实现一个简单的网路爬虫代码示例,还是挺不错的,这里分享给你们,需要的同学可以参考下。
目前市面上流行的爬虫以python居多,简单了解过后网络爬虫代码,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想网络爬虫代码,java有没有用户便捷解析html页面呢?找到了一个jsoup包,一个十分便捷解析html的工具呢。
使用方法也十分简单,引入jar包:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
使用http工具,请求获取目标页面的整个html页面信息,然后使用jsoup解析:
//获取html页面信息
String html = getHtml();
//使用jsoup将html解析为Document对象
Document doc = Jsoup.parse(html);
//后续操作就可以解析这个DOM树了,非常简单。
总结
以上就是本文关于java实现一个简单的网路爬虫代码示例的全部内容,希望对你们有所帮助。感兴趣的同学可以继续参阅本站:
爬虫基本原理
采集交流 • 优采云 发表了文章 • 0 个评论 • 323 次浏览 • 2020-05-14 08:08
本文分为如下几个部份
简单理解网路爬虫就是手动抓取网页信息的代码,可以简单理解成取代繁杂的复制粘贴操作的手段。
首先必须申明,爬虫的对象必须是你早已听到的网页,比如你不能说你想找到知乎上那个用户的关注人数最多,就希望通过写一个爬虫来帮你爬到答案。你必须明晰地晓得这个人,找到他的主页,然后才会用爬虫来抓取他页面上的信息。
下面我们用一个简单的事例来展示爬虫的工作流程。感觉多数教程第一篇都使用的是豆瓣top250,我们这儿换一个,抓取CSDN首页的文章标题,链接在这里,页面样子是这样的
抓取标题完整代码如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
这样才会复印出所有标题,展示一部分如下
上述过程是一个最简单的完整爬虫流程,可以看出它的功能就是把这些标题复制粘贴到一起,免不仅自动操作的冗长。其实爬虫通常就是做这些事的,比如我们须要用链家的数据进行剖析,看到链家的页面是这样的
我们想获取每位房屋的标题、几室几厅、多少平米、朝向、装修、价格等等数组(即指标),就可以通过爬虫进行定位,自动化抓取这100页所有房屋的那些数组信息。比如100页里有2000个房屋,总共抓取10个数组,爬虫运行结束就可以得到一个2000行10列的excel表格。
注:如果还没有安装里面两个库的读者可以在命令行下分别运行下边两行命令完成安装
pip install requests
pip install beautifulsoup4
知道了爬虫是拿来干哪些的以后,我们来介绍一些最常见到的概念
1.URL
URL英文称为统一资源定位符,其实可以理解成网页的链接,比如前面的就是一个URL。
但是更广义的URL不只是我们常听到的网页资源链接,而是资源在网页中的定位标示。我们一般说的网页是一个资源,网页中加载的每一张图片也是一个资源,它们在互联网中也有惟一的定位URL。比如我们从CSDN网页上随意找一张图片
这个链接就是这个图片资源的定位符,将这个链接输入浏览器中都会显示出这张图片网页爬虫,所以说这张图片也对应一个URL。
不过晓得如此回事就好,我们一般所说的传入URL指的就是把网页的链接传进去。上面代码中
r = requests.get('https://www.csdn.net/')
就是在将URL传入恳求函数。
2.网页恳求
说到网页恳求,就有必要讲一下我们平时浏览网页时,信息交互的模式大约是什么样的。我们平时用浏览器浏览网页的时侯,鼠标点了一个链接,比如你如今点击这儿,其实浏览器帮你向这个网页发送了恳求(request),维护网页的服务器(可以理解为CSDN公司里的一台笔记本,在维护这CSDN上的各个网页)收到了这个恳求,判定这个恳求是有效的,于是返回了一些响应信息(response)到浏览器,浏览器将这种信息进行渲染(可以理解成 处理成人能读懂的样子),就是你看见的网页的样子了。发送恳求与接收恳求的过程就和 发陌陌和收到回复的过程类似。
而如今我们要用代码来模拟滑鼠点击的过程。上面的requests.get就是使代码帮你向这个网页发送了这个恳求,如果恳求被判断为有效,网页的服务器也会把信息传送给你,传送回去的这种信息就被形参到变量r之中。所以这个变量r里就包含有我们想要的信息了,也包括这些我们想要提取的标题。
我们可以print(r.text)看一下上面有哪些东西
我们再看一下网页的源代码(如何读懂这个源码,以及这个源码如何查看下一节HTML会详尽提到)
源代码和r.text虽然是一模一样的东西。r.text虽然就是一个字符串,字符串中有我们刚才抓取到的所有标题,我们只要通过字符串匹配方式(比如正则表达式)将她们提取下来就可以了。这样说是不是觉得爬虫十分简单呢?只要这样傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接从r.text字符串中提取信息即可。其实爬虫就是那么简单。
但是解析是如何回事呢,为什么刚才不直接用正则而要用bs4呢?因为便捷,但是正则也是完全可以的,只是相对麻烦一些、需要写更多的代码而已。
3.网页解析
网页解析虽然就从网页服务器返回给我们的信息中提取我们想要数据的过程。其实使用正则表达式提取我们要的标题的过程也可以称为网页解析。
因为当前绝大多数网页源代码都是用HTML语言写的,而HTML语言时特别有规律性的,比如我们要的所有文章标题都具有相同结构,也就是说它周围的字符串都是十分类似的,这样我们能够批量获取。所以就有大鳄专门封装了怎样从HTML代码中提取特定文本的库,也就是我们平常说的网页解析库,如bs4 lxml pyquery等,其实把她们当作处理字符串的就可以了。
为了更清楚地了解怎样对网页进行解析,我们须要先简略把握HTML代码的结构。
引用维基百科中的一段话来介绍HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被诸多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面[1]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。
为了使读者对HTML有更清楚的认识,我们来写一点简单的HTML代码。用文本编辑器(记事本也可以)创建一个名子为a.html的文件,在里面写下如下代码
<!DOCTYPE html>
<html>
<head>
<title>爬虫基本原理</title>
</head>
<body>
<h1>HTML介绍</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你双击这个文件,就会手动用浏览器打开,然后你还能见到下边这个样子的页面
你若果根据我的操作来做的话,你已然创建了一个简单的网页,现在你看见的所有网页都是这样设计的,只是比你的复杂一点而已,不信你去瞧瞧刚刚截图出来的网页源代码图片。
接下来,我们来看一下HTML语言的特性。最重要的一点是网页爬虫,文本都是被标签(h1标签 p标签)夹在中间的,而这种标签都是特定的,有专门用途的。比如<h1>就表示一级标题,包在上面的文本自然会被放大显示;而<p>标签则表示段落。
再看里面的源代码截图,head meta script title div li每一个都是标签,层层嵌套。我们完全不需要晓得总共有什么种标签,也不需要晓得这种标签都是拿来干哪些的,我们只要找到我们要的信息包含在哪些标签里就行了。比如使用正则表达式就直接用<p>(.*?)</p>就可以把上面的内容提取下来了。
但是事实似乎没有这么简单,看里面的截图标签如何是这样的<nav id="nav" class="clearfix">?其实这是一个<nav>标签,后面的id class是这个标签的属性。
为什么要给标签设置属性呢?我们先考虑这样一个问题:我们看见的网页千差万别,文字的颜色字体等都不一样,这是如何设置的呢?答案是使用css样式。
css句子类似这样
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即设置对应标签的颜色、字体、大小、居中等。而当有的段落使用这个字体,有的段落使用哪个字体如何办呢?css这样设置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代码中则这样写
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同属性就是为了分辨相同标签用的,这相当于给标签进行了分类,在统一设计款式上更方便,同时对于我们依照属性定位我们想要内容的位置虽然也是更方便了。这里要说明一下,class id这两个属性比较特殊,用的也最多,所以各自弄了一个快捷键来表示,class用.,id用#。
做爬虫不需要了解刚才编撰的css代码内容放到那里之类的问题,也不需要了解css代码设置了哪些,我们只会和HTML打交道,所以只要理解HTML中属性的作用就可以了。
如果想要更进一步了解HTML和CSS,可以到w3school网站学习。
现在你就早已具备了解析网页须要的全部HTML知识了。我们通常就是依据标签名配合属性值来定位我们想要资源的位置的,其他的都不用管。这时,我们再来看爬虫的解析代码
把上面的代码再粘贴一遍如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解释一下里面代码的过程
可以看见里面的代码十分简约,思路清晰,读者可以自己想一想假如要用正则表达式怎么匹配那些标签,会发觉代码冗长好多,虽然它也有更快的优势。
那么我们是如何晓得要找寻什么样属性的div标签,为什么要找h2 a标签而不是其他的呢?这就要去剖析网页的源代码了。而这个过程也十分简单。
我们如今用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-查看网页源代码,这时才会打开一个新的页面这个页面就是这个网站的HTML源代码了,我们可以通过这个页面来看我们要的信息在那里,但是觉得十分不便捷,因为有太多无用的信息做干扰,我们难以快速掌控网页的结构。所以我们可以用另一种形式查看源代码。
用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-检查,就会弹出一个框,如下图所示
(如果没有听到这个界面,注意要切换到Element中)
这个页面最大的用处是通过折叠来使人更快探求出网页的结构。
其中的这些代码就是HTML代码,该页面的一个个标题就存在这一个个li上面。点击li后面的三角就可以展开具体的代码内容,如下图所示
可以看见文章的标题(打造一个高性能、易落地的公链开发平台)就在这个源代码之中,也就是说在我们刚才获得的r.text字符串之中。而我们代码定位路径也一目了然了,因为每位li上面还会有一个<div class="title">而每一个div上面还会有一个h2 里面有一个a,a中包含我们要的标题名称。所以我们就用find_all找到所有这样的div标签,存储为一个list,再对list进行循环,对每一个元素提取h2 a 再提取标签中的内容。
当然我们也可以find_all最外边的li标签,再一层层往里找,都是一样的。只要找到定位信息的惟一标示(标签或则属性)就可以了。
虽然在这里看源代码可以折叠一些没用的代码,但是虽然还有一些更好用的工具来辅助我们找到我们要的信息在网页源码中的位置。比如下边这个键盘符号。
在所有代码都折叠上去的情况下,点击这个键盘,之后再去点击网页中的元素,浏览器都会手动帮你把你点击的元素选中下来,其实你键盘悬在一个元素前面的时侯,就早已帮你定位了,如下图所示
当我们要爬一个网页的时侯,只须要如下流程
现在,对于一些没有丝毫反爬举措的网站我们都可以游刃有余了。至于抓取多个数组的数据怎么组织在一起、抓取多页(URL有规律的情况下)的代码怎样设计,就不是爬虫知识范畴了,这是用python基础知识就可以解决的。下一系列文章就主要讲这一部分。接下来给几个当前可以练手的网站
如果使用BeautifulSoup的定位的过程中遇见困难,可以直接到网上搜教程,也可以等我们这个专题前面更新的BeautifulSoup详尽介绍。
如果你去抓取其他网站,最好先看一下r.text是不是和网站源代码一模一样,如果不是,说明你对方服务器没有把真正的信息给你,说明他可能看出你是爬虫了(进行网页恳求的时侯,浏览器和requests.get都相当于带着一堆资格证去敲门,对方会检测你这种资格证,浏览器的资格证通常是可以通过的,而代码的资格证就可能不合格,因为代码的资格证可能有一些比较固定的特征,对方服务器预先设定好,资格证是这样的恳求一律拒绝,因为她们一定是爬虫,这就是反爬虫机制),这时就须要懂一些反反爬举措就能获得真正的信息,反反爬方式的学习是一个积累的过程,我们前面再讲。读者假如遇见一些反爬机制,可以到网上查这个网站的爬虫,估计都能查到一些博客讲怎么破解,甚至直接贴出代码。
在这篇的基础上抓取多页以及代码设计的改进看下边这三篇续集
爬虫代码改进(一)
爬虫代码改进(二)
爬虫代码改进(三)
专栏主页:python编程
专栏目录:目录
爬虫目录:爬虫系列目录
版本说明:软件及包版本说明 查看全部
这篇文章的定位是,给有一些python基础,但是对爬虫一无所知的人写的。文中只会涉及到爬虫最核心的部份,完全避免莫名其妙的坑或概念,让读者认为爬虫是一件极其简单的事情,而事实上爬虫确实是一件极其简单的事情(如果你不是以爬虫为工作的话)。
本文分为如下几个部份
简单理解网路爬虫就是手动抓取网页信息的代码,可以简单理解成取代繁杂的复制粘贴操作的手段。
首先必须申明,爬虫的对象必须是你早已听到的网页,比如你不能说你想找到知乎上那个用户的关注人数最多,就希望通过写一个爬虫来帮你爬到答案。你必须明晰地晓得这个人,找到他的主页,然后才会用爬虫来抓取他页面上的信息。
下面我们用一个简单的事例来展示爬虫的工作流程。感觉多数教程第一篇都使用的是豆瓣top250,我们这儿换一个,抓取CSDN首页的文章标题,链接在这里,页面样子是这样的

抓取标题完整代码如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
这样才会复印出所有标题,展示一部分如下

上述过程是一个最简单的完整爬虫流程,可以看出它的功能就是把这些标题复制粘贴到一起,免不仅自动操作的冗长。其实爬虫通常就是做这些事的,比如我们须要用链家的数据进行剖析,看到链家的页面是这样的

我们想获取每位房屋的标题、几室几厅、多少平米、朝向、装修、价格等等数组(即指标),就可以通过爬虫进行定位,自动化抓取这100页所有房屋的那些数组信息。比如100页里有2000个房屋,总共抓取10个数组,爬虫运行结束就可以得到一个2000行10列的excel表格。
注:如果还没有安装里面两个库的读者可以在命令行下分别运行下边两行命令完成安装
pip install requests
pip install beautifulsoup4
知道了爬虫是拿来干哪些的以后,我们来介绍一些最常见到的概念
1.URL
URL英文称为统一资源定位符,其实可以理解成网页的链接,比如前面的就是一个URL。
但是更广义的URL不只是我们常听到的网页资源链接,而是资源在网页中的定位标示。我们一般说的网页是一个资源,网页中加载的每一张图片也是一个资源,它们在互联网中也有惟一的定位URL。比如我们从CSDN网页上随意找一张图片

这个链接就是这个图片资源的定位符,将这个链接输入浏览器中都会显示出这张图片网页爬虫,所以说这张图片也对应一个URL。
不过晓得如此回事就好,我们一般所说的传入URL指的就是把网页的链接传进去。上面代码中
r = requests.get('https://www.csdn.net/')
就是在将URL传入恳求函数。
2.网页恳求
说到网页恳求,就有必要讲一下我们平时浏览网页时,信息交互的模式大约是什么样的。我们平时用浏览器浏览网页的时侯,鼠标点了一个链接,比如你如今点击这儿,其实浏览器帮你向这个网页发送了恳求(request),维护网页的服务器(可以理解为CSDN公司里的一台笔记本,在维护这CSDN上的各个网页)收到了这个恳求,判定这个恳求是有效的,于是返回了一些响应信息(response)到浏览器,浏览器将这种信息进行渲染(可以理解成 处理成人能读懂的样子),就是你看见的网页的样子了。发送恳求与接收恳求的过程就和 发陌陌和收到回复的过程类似。
而如今我们要用代码来模拟滑鼠点击的过程。上面的requests.get就是使代码帮你向这个网页发送了这个恳求,如果恳求被判断为有效,网页的服务器也会把信息传送给你,传送回去的这种信息就被形参到变量r之中。所以这个变量r里就包含有我们想要的信息了,也包括这些我们想要提取的标题。
我们可以print(r.text)看一下上面有哪些东西

我们再看一下网页的源代码(如何读懂这个源码,以及这个源码如何查看下一节HTML会详尽提到)

源代码和r.text虽然是一模一样的东西。r.text虽然就是一个字符串,字符串中有我们刚才抓取到的所有标题,我们只要通过字符串匹配方式(比如正则表达式)将她们提取下来就可以了。这样说是不是觉得爬虫十分简单呢?只要这样傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接从r.text字符串中提取信息即可。其实爬虫就是那么简单。
但是解析是如何回事呢,为什么刚才不直接用正则而要用bs4呢?因为便捷,但是正则也是完全可以的,只是相对麻烦一些、需要写更多的代码而已。
3.网页解析
网页解析虽然就从网页服务器返回给我们的信息中提取我们想要数据的过程。其实使用正则表达式提取我们要的标题的过程也可以称为网页解析。
因为当前绝大多数网页源代码都是用HTML语言写的,而HTML语言时特别有规律性的,比如我们要的所有文章标题都具有相同结构,也就是说它周围的字符串都是十分类似的,这样我们能够批量获取。所以就有大鳄专门封装了怎样从HTML代码中提取特定文本的库,也就是我们平常说的网页解析库,如bs4 lxml pyquery等,其实把她们当作处理字符串的就可以了。
为了更清楚地了解怎样对网页进行解析,我们须要先简略把握HTML代码的结构。
引用维基百科中的一段话来介绍HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被诸多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面[1]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。
为了使读者对HTML有更清楚的认识,我们来写一点简单的HTML代码。用文本编辑器(记事本也可以)创建一个名子为a.html的文件,在里面写下如下代码
<!DOCTYPE html>
<html>
<head>
<title>爬虫基本原理</title>
</head>
<body>
<h1>HTML介绍</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你双击这个文件,就会手动用浏览器打开,然后你还能见到下边这个样子的页面

你若果根据我的操作来做的话,你已然创建了一个简单的网页,现在你看见的所有网页都是这样设计的,只是比你的复杂一点而已,不信你去瞧瞧刚刚截图出来的网页源代码图片。
接下来,我们来看一下HTML语言的特性。最重要的一点是网页爬虫,文本都是被标签(h1标签 p标签)夹在中间的,而这种标签都是特定的,有专门用途的。比如<h1>就表示一级标题,包在上面的文本自然会被放大显示;而<p>标签则表示段落。
再看里面的源代码截图,head meta script title div li每一个都是标签,层层嵌套。我们完全不需要晓得总共有什么种标签,也不需要晓得这种标签都是拿来干哪些的,我们只要找到我们要的信息包含在哪些标签里就行了。比如使用正则表达式就直接用<p>(.*?)</p>就可以把上面的内容提取下来了。
但是事实似乎没有这么简单,看里面的截图标签如何是这样的<nav id="nav" class="clearfix">?其实这是一个<nav>标签,后面的id class是这个标签的属性。
为什么要给标签设置属性呢?我们先考虑这样一个问题:我们看见的网页千差万别,文字的颜色字体等都不一样,这是如何设置的呢?答案是使用css样式。
css句子类似这样
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即设置对应标签的颜色、字体、大小、居中等。而当有的段落使用这个字体,有的段落使用哪个字体如何办呢?css这样设置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代码中则这样写
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同属性就是为了分辨相同标签用的,这相当于给标签进行了分类,在统一设计款式上更方便,同时对于我们依照属性定位我们想要内容的位置虽然也是更方便了。这里要说明一下,class id这两个属性比较特殊,用的也最多,所以各自弄了一个快捷键来表示,class用.,id用#。
做爬虫不需要了解刚才编撰的css代码内容放到那里之类的问题,也不需要了解css代码设置了哪些,我们只会和HTML打交道,所以只要理解HTML中属性的作用就可以了。
如果想要更进一步了解HTML和CSS,可以到w3school网站学习。
现在你就早已具备了解析网页须要的全部HTML知识了。我们通常就是依据标签名配合属性值来定位我们想要资源的位置的,其他的都不用管。这时,我们再来看爬虫的解析代码
把上面的代码再粘贴一遍如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解释一下里面代码的过程
可以看见里面的代码十分简约,思路清晰,读者可以自己想一想假如要用正则表达式怎么匹配那些标签,会发觉代码冗长好多,虽然它也有更快的优势。
那么我们是如何晓得要找寻什么样属性的div标签,为什么要找h2 a标签而不是其他的呢?这就要去剖析网页的源代码了。而这个过程也十分简单。
我们如今用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-查看网页源代码,这时才会打开一个新的页面这个页面就是这个网站的HTML源代码了,我们可以通过这个页面来看我们要的信息在那里,但是觉得十分不便捷,因为有太多无用的信息做干扰,我们难以快速掌控网页的结构。所以我们可以用另一种形式查看源代码。
用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-检查,就会弹出一个框,如下图所示

(如果没有听到这个界面,注意要切换到Element中)
这个页面最大的用处是通过折叠来使人更快探求出网页的结构。
其中的这些代码就是HTML代码,该页面的一个个标题就存在这一个个li上面。点击li后面的三角就可以展开具体的代码内容,如下图所示

可以看见文章的标题(打造一个高性能、易落地的公链开发平台)就在这个源代码之中,也就是说在我们刚才获得的r.text字符串之中。而我们代码定位路径也一目了然了,因为每位li上面还会有一个<div class="title">而每一个div上面还会有一个h2 里面有一个a,a中包含我们要的标题名称。所以我们就用find_all找到所有这样的div标签,存储为一个list,再对list进行循环,对每一个元素提取h2 a 再提取标签中的内容。
当然我们也可以find_all最外边的li标签,再一层层往里找,都是一样的。只要找到定位信息的惟一标示(标签或则属性)就可以了。
虽然在这里看源代码可以折叠一些没用的代码,但是虽然还有一些更好用的工具来辅助我们找到我们要的信息在网页源码中的位置。比如下边这个键盘符号。

在所有代码都折叠上去的情况下,点击这个键盘,之后再去点击网页中的元素,浏览器都会手动帮你把你点击的元素选中下来,其实你键盘悬在一个元素前面的时侯,就早已帮你定位了,如下图所示

当我们要爬一个网页的时侯,只须要如下流程
现在,对于一些没有丝毫反爬举措的网站我们都可以游刃有余了。至于抓取多个数组的数据怎么组织在一起、抓取多页(URL有规律的情况下)的代码怎样设计,就不是爬虫知识范畴了,这是用python基础知识就可以解决的。下一系列文章就主要讲这一部分。接下来给几个当前可以练手的网站
如果使用BeautifulSoup的定位的过程中遇见困难,可以直接到网上搜教程,也可以等我们这个专题前面更新的BeautifulSoup详尽介绍。
如果你去抓取其他网站,最好先看一下r.text是不是和网站源代码一模一样,如果不是,说明你对方服务器没有把真正的信息给你,说明他可能看出你是爬虫了(进行网页恳求的时侯,浏览器和requests.get都相当于带着一堆资格证去敲门,对方会检测你这种资格证,浏览器的资格证通常是可以通过的,而代码的资格证就可能不合格,因为代码的资格证可能有一些比较固定的特征,对方服务器预先设定好,资格证是这样的恳求一律拒绝,因为她们一定是爬虫,这就是反爬虫机制),这时就须要懂一些反反爬举措就能获得真正的信息,反反爬方式的学习是一个积累的过程,我们前面再讲。读者假如遇见一些反爬机制,可以到网上查这个网站的爬虫,估计都能查到一些博客讲怎么破解,甚至直接贴出代码。
在这篇的基础上抓取多页以及代码设计的改进看下边这三篇续集
爬虫代码改进(一)
爬虫代码改进(二)
爬虫代码改进(三)
专栏主页:python编程
专栏目录:目录
爬虫目录:爬虫系列目录
版本说明:软件及包版本说明
了解网页结构
采集交流 • 优采云 发表了文章 • 0 个评论 • 248 次浏览 • 2020-05-08 08:01
学习爬虫, 首先要懂的是网页. 支撑起各类光鲜亮丽的网页的不是别的, 全都是一些代码.这种代码我们称之为 HTML,HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这些语言转换成我们用肉眼见到的网页.所以 HTML 里面必将存在着好多规律, 我们的爬虫还能根据这样的规律来爬取你须要的信息.
其实不仅 HTML, 一同打造多彩/多功能网页的组件还有 CSS 和. 但是这个简单的爬虫教程,大部分时间会将会使用 HTML.CSS 和 JavaScript 会在后期简单介绍一下. 因为爬网页的时侯多多少少还是要和 CSS JavaScript 打交道的.
虽然莫烦Python主打的是机器学习的教程. 但是这个爬虫教程适用于任何想学爬虫的朋友们.从机器学习的角度看爬虫结构, 机器学习中的大量数据, 也是可以从这种网页中来, 使用爬虫来爬取各类网页里面的信息, 然后再装入各类机器学习的方式,这样的应用途径正在越来越多被采用. 所以假如你的数据也是分散在各个网页中, 爬虫是你降低人力劳动的必修课.
网页基本组成部分
在真正步入爬虫之前, 我们先来做一下热身运动, 弄明白网页的基础, HTML 有什么组成部分,是怎么样运作的. 如果你早已十分熟悉网页的构造了, 欢迎直接跳过这一节, 进入下边的学习.
我制做了一个特别简易的网页, 给你们呈现以下最肉感的 HTML 结构.如果你点开它, 呈现在你眼前的, 就是下边这张图的上半部份. 而下半部份就是我们网页背后的 HTML code.
想问我是怎么见到 HTML 的 source code 的? 其实很简单, 在你的浏览器中 (我用的是 Google Chrome),显示网页的地方, 点击滑鼠右键,大多数浏览器就会有类似这样一个选项 “View Page Source”. 点击它能够看见页面的源码了.
在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的方式, 或有不同的功能.主体的 tag 分成两部份, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看见的网页中的.这些信息大多数时侯是给浏览器看, 或者是给搜索引擎的爬虫看.
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
HTML 的第二大块是 body, 这个部份才是你看见的网页信息. 网页中的 heading, 视频, 图片和文字等都储存在这里.这里的 <h1></h1> tag 就是主标题, 我们看见呈现下来的疗效就是大一号的文字. <p></p> 里面的文字就是一个段落.<a></a>里面都是一些链接. 所以好多情况, 东西都是置于这种 tag 中的.
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
爬虫想要做的就是按照这种 tag 来找到合适的信息.
用 Python 登录网页
好了, 对网页结构和 HTML 有了一些基本认识之后, 我们能够用 Python 来爬取这个网页的一些基本信息.首先要做的, 是使用 Python 来登入这个网页, 并复印出这个网页 HTML 的 source code.注意, 因为网页中存在英文, 为了正常显示英文, read() 完之后, 我们要对读下来的文字进行转换, decode() 成可以正常显示英文的方式.
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
print 出来就是下边这样啦. 这就证明了我们能否成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和借助.我们发觉, 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
</html>
匹配网页内容
所以这儿我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 我有一个很不错的正则表达式的教程,如果是中级的网页匹配, 我们使用正则完全就可以了, 高级一点或则比较冗长的匹配, 我还是推荐使用 BeautifulSoup.不急不急, 我知道你想偷懒, 我然后马上还会教 beautiful soup 了. 但是如今我们还是使用正则来做几个简单的事例, 让你熟悉一下套路.
如果我们想用代码找到这个网页的 title, 我们能够这样写. 选好要使用的 tag 名称 <title>. 使用正则匹配.
import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫烦Python
如果想要找到中间的那种段落 <p>, 我们使用下边方式, 因为这个段落在 HTML 中还参杂着 tab, new line, 所以我们给一个flags=re.DOTALL 来对那些 tab, new line 不敏感.
res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到笔记本里,就靠这样的途径了.
res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
下次我们就来瞧瞧为了图方面爬虫结构, 我们怎样使用 BeautifulSoup.
相关教程 查看全部
学习资料:
学习爬虫, 首先要懂的是网页. 支撑起各类光鲜亮丽的网页的不是别的, 全都是一些代码.这种代码我们称之为 HTML,HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这些语言转换成我们用肉眼见到的网页.所以 HTML 里面必将存在着好多规律, 我们的爬虫还能根据这样的规律来爬取你须要的信息.
其实不仅 HTML, 一同打造多彩/多功能网页的组件还有 CSS 和. 但是这个简单的爬虫教程,大部分时间会将会使用 HTML.CSS 和 JavaScript 会在后期简单介绍一下. 因为爬网页的时侯多多少少还是要和 CSS JavaScript 打交道的.

虽然莫烦Python主打的是机器学习的教程. 但是这个爬虫教程适用于任何想学爬虫的朋友们.从机器学习的角度看爬虫结构, 机器学习中的大量数据, 也是可以从这种网页中来, 使用爬虫来爬取各类网页里面的信息, 然后再装入各类机器学习的方式,这样的应用途径正在越来越多被采用. 所以假如你的数据也是分散在各个网页中, 爬虫是你降低人力劳动的必修课.
网页基本组成部分
在真正步入爬虫之前, 我们先来做一下热身运动, 弄明白网页的基础, HTML 有什么组成部分,是怎么样运作的. 如果你早已十分熟悉网页的构造了, 欢迎直接跳过这一节, 进入下边的学习.
我制做了一个特别简易的网页, 给你们呈现以下最肉感的 HTML 结构.如果你点开它, 呈现在你眼前的, 就是下边这张图的上半部份. 而下半部份就是我们网页背后的 HTML code.

想问我是怎么见到 HTML 的 source code 的? 其实很简单, 在你的浏览器中 (我用的是 Google Chrome),显示网页的地方, 点击滑鼠右键,大多数浏览器就会有类似这样一个选项 “View Page Source”. 点击它能够看见页面的源码了.

在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的方式, 或有不同的功能.主体的 tag 分成两部份, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看见的网页中的.这些信息大多数时侯是给浏览器看, 或者是给搜索引擎的爬虫看.
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
HTML 的第二大块是 body, 这个部份才是你看见的网页信息. 网页中的 heading, 视频, 图片和文字等都储存在这里.这里的 <h1></h1> tag 就是主标题, 我们看见呈现下来的疗效就是大一号的文字. <p></p> 里面的文字就是一个段落.<a></a>里面都是一些链接. 所以好多情况, 东西都是置于这种 tag 中的.
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
爬虫想要做的就是按照这种 tag 来找到合适的信息.
用 Python 登录网页
好了, 对网页结构和 HTML 有了一些基本认识之后, 我们能够用 Python 来爬取这个网页的一些基本信息.首先要做的, 是使用 Python 来登入这个网页, 并复印出这个网页 HTML 的 source code.注意, 因为网页中存在英文, 为了正常显示英文, read() 完之后, 我们要对读下来的文字进行转换, decode() 成可以正常显示英文的方式.
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
print 出来就是下边这样啦. 这就证明了我们能否成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和借助.我们发觉, 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
</html>
匹配网页内容
所以这儿我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 我有一个很不错的正则表达式的教程,如果是中级的网页匹配, 我们使用正则完全就可以了, 高级一点或则比较冗长的匹配, 我还是推荐使用 BeautifulSoup.不急不急, 我知道你想偷懒, 我然后马上还会教 beautiful soup 了. 但是如今我们还是使用正则来做几个简单的事例, 让你熟悉一下套路.
如果我们想用代码找到这个网页的 title, 我们能够这样写. 选好要使用的 tag 名称 <title>. 使用正则匹配.
import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫烦Python
如果想要找到中间的那种段落 <p>, 我们使用下边方式, 因为这个段落在 HTML 中还参杂着 tab, new line, 所以我们给一个flags=re.DOTALL 来对那些 tab, new line 不敏感.
res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到笔记本里,就靠这样的途径了.
res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
下次我们就来瞧瞧为了图方面爬虫结构, 我们怎样使用 BeautifulSoup.
相关教程
PHP写微信公众号文章页采集方法
采集交流 • 优采云 发表了文章 • 0 个评论 • 429 次浏览 • 2020-07-24 08:04
另外注意:这个匹配规则会可能在一段时间以后有变化。这篇文章会尽量保持更新。如果你按照我的文章制作了采集系统以后,当某三天失效了,别忘了回去再瞧瞧文章是否有更新。
2)内容处理:
通过前面的方式我们获得了文章内容的html,但是你将文章内容显示下来以后才会发觉,图片和视频不能正常显示。因为这个html还须要一些加工:
首先是图片,微信文章中的标签中的src属性全部都用了data-src属性替代。只有在显示的时侯就会被替换过来。所以我们也有两个方案,将源代码直接替换过来,或者用js在显示时侯再替换。下面我先介绍直接替换html的方式:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("data-src","src",$content);
然后是视频,视频的显示不正常,经过常年测试后发觉只要替换一个页面地址才能解决,过程就不说了,直接说结果:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("preview.html","player.html",$content);
通过这两个替换过后,文章内容html中的图片和视频就都正常了。
3) 公众号相关信息:
通过本专栏之前的文章,介绍了我们使用陌陌客户端,任意打开一个公众号的历史消息页以后。系统从数据库中辨识biz的值,发现数据库中没有记录,就会插入一条新的纪录。之后的采集队列都会定期按照这个biz来获取这个公众号的历史消息列表。
但是我们只获得了这个公众号的biz,公众号的名称,头像这两个重要信息还是没有获取到。主要诱因是历史消息页面中没有这两个信息。但是我们可以从文章页面中获取到。
在陌陌文章页面html的顶部,有一些js的变量形参的代码,通过正则匹配然后我们就可以获得这两个公众号的信息:
1
2
3
4
5
6
7
//$html变量的值是上面获取到的文章全部html
preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
$nickname = $m[1][0];//公众号爱称
preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
$head_img = $m[1][0];//公众号头像
通过这两个正则匹配,我们才能获取到公众号的头像和爱称,然后按照文章地址中的biz,可以保存到对应的微信号数据表中。
3、文章的保存和处理
前面的代码已然将文章内容获取到变量中了。如何保存虽然每个人似乎都有自己的看法。我这儿介绍一下我的保存内容的方式:
将文章内容的html以数据库id为文件名保存成html文件,以biz数组为目录。
1
2
3
4
5
6
7
8
9
10
11
$dir = "./".$biz."/";
$filename = $dir.$id.".html";
if(!is_dir($dir)) {
mkdir($cache_dir);
chmod($cache_dir,0777);
}
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
以上代码是一个标准的php构建文件夹保存文件的代码,大家可以依照自己的实际情况安排保存方式。
在这以后我们就可以在自己的服务器上得到一个html文件,内容就是公众号的文章内容。我们可以从浏览器中打开看一下。这时你或许会发觉图片防盗链了!无法正常显示!包括数据库中保存的文章封面图,公众号的头像都是防盗链的。
别急,这个问题挺好解决,只须要将图片也保存到自己的服务器,无非是将来会占用自己的服务器空间和带宽。
图片防盗链的原理是当图片在网页中显示的时侯php 采集微信文章图片,图片服务器会测量到引用这张图片的服务器域名,当发觉服务器域名不包含或的时侯才会被替换成防盗链图片。
但是假若测量不到引用页面的域名才会正常显示,所以我们通过php的函数file_get_content()就可以将图片的二进制代码获取过来,然后按照自己的看法起个文件名保存到自己的服务器上。在这里再介绍一个保存图片的方式,我目前使用了腾讯云的“万象优图”,通过它们提供的api将图片保存到云空间,这样的用处是读取图片时直接在图片的链接地址加上希望得到的图片规格大小参数,就可以直接得到一张缩略图。比存在自己的服务器便捷得多。阿里云也应当有同样的产品php 采集微信文章图片,好像名叫对象储存。
另外,我采集公众号内容的目的是制做成一个新闻app,在app上将html代码显示下来以后,因为app同样没有域名,防盗链服务器也同样不会觉得图片被盗链了。这样就可以直接显示图片下来。 查看全部
另外注意:这个匹配规则会可能在一段时间以后有变化。这篇文章会尽量保持更新。如果你按照我的文章制作了采集系统以后,当某三天失效了,别忘了回去再瞧瞧文章是否有更新。
2)内容处理:
通过前面的方式我们获得了文章内容的html,但是你将文章内容显示下来以后才会发觉,图片和视频不能正常显示。因为这个html还须要一些加工:
首先是图片,微信文章中的标签中的src属性全部都用了data-src属性替代。只有在显示的时侯就会被替换过来。所以我们也有两个方案,将源代码直接替换过来,或者用js在显示时侯再替换。下面我先介绍直接替换html的方式:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("data-src","src",$content);
然后是视频,视频的显示不正常,经过常年测试后发觉只要替换一个页面地址才能解决,过程就不说了,直接说结果:
1
2
3
4
//$content变量的值是上面获取到的文章内容html
$content = str_replace("preview.html","player.html",$content);
通过这两个替换过后,文章内容html中的图片和视频就都正常了。
3) 公众号相关信息:
通过本专栏之前的文章,介绍了我们使用陌陌客户端,任意打开一个公众号的历史消息页以后。系统从数据库中辨识biz的值,发现数据库中没有记录,就会插入一条新的纪录。之后的采集队列都会定期按照这个biz来获取这个公众号的历史消息列表。
但是我们只获得了这个公众号的biz,公众号的名称,头像这两个重要信息还是没有获取到。主要诱因是历史消息页面中没有这两个信息。但是我们可以从文章页面中获取到。
在陌陌文章页面html的顶部,有一些js的变量形参的代码,通过正则匹配然后我们就可以获得这两个公众号的信息:
1
2
3
4
5
6
7
//$html变量的值是上面获取到的文章全部html
preg_match_all('/var nickname = \"(.*?)\";/si',$html,$m);
$nickname = $m[1][0];//公众号爱称
preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
$head_img = $m[1][0];//公众号头像
通过这两个正则匹配,我们才能获取到公众号的头像和爱称,然后按照文章地址中的biz,可以保存到对应的微信号数据表中。
3、文章的保存和处理
前面的代码已然将文章内容获取到变量中了。如何保存虽然每个人似乎都有自己的看法。我这儿介绍一下我的保存内容的方式:
将文章内容的html以数据库id为文件名保存成html文件,以biz数组为目录。
1
2
3
4
5
6
7
8
9
10
11
$dir = "./".$biz."/";
$filename = $dir.$id.".html";
if(!is_dir($dir)) {
mkdir($cache_dir);
chmod($cache_dir,0777);
}
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
以上代码是一个标准的php构建文件夹保存文件的代码,大家可以依照自己的实际情况安排保存方式。
在这以后我们就可以在自己的服务器上得到一个html文件,内容就是公众号的文章内容。我们可以从浏览器中打开看一下。这时你或许会发觉图片防盗链了!无法正常显示!包括数据库中保存的文章封面图,公众号的头像都是防盗链的。
别急,这个问题挺好解决,只须要将图片也保存到自己的服务器,无非是将来会占用自己的服务器空间和带宽。
图片防盗链的原理是当图片在网页中显示的时侯php 采集微信文章图片,图片服务器会测量到引用这张图片的服务器域名,当发觉服务器域名不包含或的时侯才会被替换成防盗链图片。
但是假若测量不到引用页面的域名才会正常显示,所以我们通过php的函数file_get_content()就可以将图片的二进制代码获取过来,然后按照自己的看法起个文件名保存到自己的服务器上。在这里再介绍一个保存图片的方式,我目前使用了腾讯云的“万象优图”,通过它们提供的api将图片保存到云空间,这样的用处是读取图片时直接在图片的链接地址加上希望得到的图片规格大小参数,就可以直接得到一张缩略图。比存在自己的服务器便捷得多。阿里云也应当有同样的产品php 采集微信文章图片,好像名叫对象储存。
另外,我采集公众号内容的目的是制做成一个新闻app,在app上将html代码显示下来以后,因为app同样没有域名,防盗链服务器也同样不会觉得图片被盗链了。这样就可以直接显示图片下来。
【原创源码】网络爬虫
采集交流 • 优采云 发表了文章 • 0 个评论 • 324 次浏览 • 2020-07-02 08:01
最近因为女朋友工作需求,需要获取各大团购网站上的店家信息,这样自动一个一个点不得气死,于是我就写了一个网络爬虫来解决这个问题,是用java写的,主要用到了两个开源库,httpclient和jsoup...用来获取网页数据和得到想要的数据,不过最好是有点web基础网络爬虫代码,这样就可以只要想要的值,不然会有很多没用的数据,后期还要自动删掉,比较麻烦...下面附上源码和说明...
[Asm] 纯文本查看 复制代码
public static String getHtmlByUrl(String url){
String html = null;
HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象
HttpGet httpget = new HttpGet(url);//以get方式请求该URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce对象
int resStatu = responce.getStatusLine().getStatusCode();//返回码
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不对
//获得相应实体
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//获得html源代码
InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("访问【"+url+"】出现异常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
}
上面的就是httpclient库的内容,用它来获取html页面的数据
[Java] 纯文本查看 复制代码
public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要获取数据的网址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基础的话,可以设置一下这里,知道自己想要的数据
for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
这个就是解析获取来的html数据,找到自己想要的数据....
然后把取到的数据存入excel获取txt里就随大伙便了,不过这个方式有一个漏洞就是,只能取静态页面,动态页面未能实现,我还要再继续研究一下,研究下来了,再发下来,如果有哪些不懂的网络爬虫代码,可以问我,知道的一定告诉你们,希望你们多评分,多鼓励,非常谢谢!!!! 查看全部

最近因为女朋友工作需求,需要获取各大团购网站上的店家信息,这样自动一个一个点不得气死,于是我就写了一个网络爬虫来解决这个问题,是用java写的,主要用到了两个开源库,httpclient和jsoup...用来获取网页数据和得到想要的数据,不过最好是有点web基础网络爬虫代码,这样就可以只要想要的值,不然会有很多没用的数据,后期还要自动删掉,比较麻烦...下面附上源码和说明...
[Asm] 纯文本查看 复制代码
public static String getHtmlByUrl(String url){
String html = null;
HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象
HttpGet httpget = new HttpGet(url);//以get方式请求该URL
try {
HttpResponse responce = httpClient.execute(httpget);//得到responce对象
int resStatu = responce.getStatusLine().getStatusCode();//返回码
if (resStatu==HttpStatus.SC_OK) {//200正常 其他就不对
//获得相应实体
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//html = EntityUtils.toString(entity);//获得html源代码
InputStream in = entity.getContent();
entity.getContentType();
Scanner sc = new Scanner(in);
StringBuffer str = new StringBuffer("utf-8");
while(sc.hasNextLine()){
str.append(sc.nextLine());
}
html = str.toString();
//sc.close();
}
}
} catch (Exception e) {
System.out.println("访问【"+url+"】出现异常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
}
上面的就是httpclient库的内容,用它来获取html页面的数据
[Java] 纯文本查看 复制代码
public static void main(String[] args) throws WriteException, IOException {
String html = getHtmlByUrl("需要获取数据的网址");
if (html!=null&&!"".equals(html)) {
Document doc = Jsoup.parse(html);
Elements linksElements = doc.select("div.basic>a"); //如果有web基础的话,可以设置一下这里,知道自己想要的数据
for (Element ele:linksElements) {
String href = ele.attr("href");
String title = ele.text();
System.out.println(href+","+title);
}
}
}
这个就是解析获取来的html数据,找到自己想要的数据....
然后把取到的数据存入excel获取txt里就随大伙便了,不过这个方式有一个漏洞就是,只能取静态页面,动态页面未能实现,我还要再继续研究一下,研究下来了,再发下来,如果有哪些不懂的网络爬虫代码,可以问我,知道的一定告诉你们,希望你们多评分,多鼓励,非常谢谢!!!!
java实现一个简单的网路爬虫代码示例
采集交流 • 优采云 发表了文章 • 0 个评论 • 276 次浏览 • 2020-05-15 08:01
这篇文章主要介绍了java实现一个简单的网路爬虫代码示例,还是挺不错的,这里分享给你们,需要的同学可以参考下。
目前市面上流行的爬虫以python居多,简单了解过后网络爬虫代码,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想网络爬虫代码,java有没有用户便捷解析html页面呢?找到了一个jsoup包,一个十分便捷解析html的工具呢。
使用方法也十分简单,引入jar包:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
使用http工具,请求获取目标页面的整个html页面信息,然后使用jsoup解析:
//获取html页面信息
String html = getHtml();
//使用jsoup将html解析为Document对象
Document doc = Jsoup.parse(html);
//后续操作就可以解析这个DOM树了,非常简单。
总结
以上就是本文关于java实现一个简单的网路爬虫代码示例的全部内容,希望对你们有所帮助。感兴趣的同学可以继续参阅本站: 查看全部
更新时间:2017年11月13日 08:50:04 作者:在远行的路上
这篇文章主要介绍了java实现一个简单的网路爬虫代码示例,还是挺不错的,这里分享给你们,需要的同学可以参考下。
目前市面上流行的爬虫以python居多,简单了解过后网络爬虫代码,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想网络爬虫代码,java有没有用户便捷解析html页面呢?找到了一个jsoup包,一个十分便捷解析html的工具呢。
使用方法也十分简单,引入jar包:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
使用http工具,请求获取目标页面的整个html页面信息,然后使用jsoup解析:
//获取html页面信息
String html = getHtml();
//使用jsoup将html解析为Document对象
Document doc = Jsoup.parse(html);
//后续操作就可以解析这个DOM树了,非常简单。
总结
以上就是本文关于java实现一个简单的网路爬虫代码示例的全部内容,希望对你们有所帮助。感兴趣的同学可以继续参阅本站:
爬虫基本原理
采集交流 • 优采云 发表了文章 • 0 个评论 • 323 次浏览 • 2020-05-14 08:08
本文分为如下几个部份
简单理解网路爬虫就是手动抓取网页信息的代码,可以简单理解成取代繁杂的复制粘贴操作的手段。
首先必须申明,爬虫的对象必须是你早已听到的网页,比如你不能说你想找到知乎上那个用户的关注人数最多,就希望通过写一个爬虫来帮你爬到答案。你必须明晰地晓得这个人,找到他的主页,然后才会用爬虫来抓取他页面上的信息。
下面我们用一个简单的事例来展示爬虫的工作流程。感觉多数教程第一篇都使用的是豆瓣top250,我们这儿换一个,抓取CSDN首页的文章标题,链接在这里,页面样子是这样的
抓取标题完整代码如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
这样才会复印出所有标题,展示一部分如下
上述过程是一个最简单的完整爬虫流程,可以看出它的功能就是把这些标题复制粘贴到一起,免不仅自动操作的冗长。其实爬虫通常就是做这些事的,比如我们须要用链家的数据进行剖析,看到链家的页面是这样的
我们想获取每位房屋的标题、几室几厅、多少平米、朝向、装修、价格等等数组(即指标),就可以通过爬虫进行定位,自动化抓取这100页所有房屋的那些数组信息。比如100页里有2000个房屋,总共抓取10个数组,爬虫运行结束就可以得到一个2000行10列的excel表格。
注:如果还没有安装里面两个库的读者可以在命令行下分别运行下边两行命令完成安装
pip install requests
pip install beautifulsoup4
知道了爬虫是拿来干哪些的以后,我们来介绍一些最常见到的概念
1.URL
URL英文称为统一资源定位符,其实可以理解成网页的链接,比如前面的就是一个URL。
但是更广义的URL不只是我们常听到的网页资源链接,而是资源在网页中的定位标示。我们一般说的网页是一个资源,网页中加载的每一张图片也是一个资源,它们在互联网中也有惟一的定位URL。比如我们从CSDN网页上随意找一张图片
这个链接就是这个图片资源的定位符,将这个链接输入浏览器中都会显示出这张图片网页爬虫,所以说这张图片也对应一个URL。
不过晓得如此回事就好,我们一般所说的传入URL指的就是把网页的链接传进去。上面代码中
r = requests.get('https://www.csdn.net/')
就是在将URL传入恳求函数。
2.网页恳求
说到网页恳求,就有必要讲一下我们平时浏览网页时,信息交互的模式大约是什么样的。我们平时用浏览器浏览网页的时侯,鼠标点了一个链接,比如你如今点击这儿,其实浏览器帮你向这个网页发送了恳求(request),维护网页的服务器(可以理解为CSDN公司里的一台笔记本,在维护这CSDN上的各个网页)收到了这个恳求,判定这个恳求是有效的,于是返回了一些响应信息(response)到浏览器,浏览器将这种信息进行渲染(可以理解成 处理成人能读懂的样子),就是你看见的网页的样子了。发送恳求与接收恳求的过程就和 发陌陌和收到回复的过程类似。
而如今我们要用代码来模拟滑鼠点击的过程。上面的requests.get就是使代码帮你向这个网页发送了这个恳求,如果恳求被判断为有效,网页的服务器也会把信息传送给你,传送回去的这种信息就被形参到变量r之中。所以这个变量r里就包含有我们想要的信息了,也包括这些我们想要提取的标题。
我们可以print(r.text)看一下上面有哪些东西
我们再看一下网页的源代码(如何读懂这个源码,以及这个源码如何查看下一节HTML会详尽提到)
源代码和r.text虽然是一模一样的东西。r.text虽然就是一个字符串,字符串中有我们刚才抓取到的所有标题,我们只要通过字符串匹配方式(比如正则表达式)将她们提取下来就可以了。这样说是不是觉得爬虫十分简单呢?只要这样傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接从r.text字符串中提取信息即可。其实爬虫就是那么简单。
但是解析是如何回事呢,为什么刚才不直接用正则而要用bs4呢?因为便捷,但是正则也是完全可以的,只是相对麻烦一些、需要写更多的代码而已。
3.网页解析
网页解析虽然就从网页服务器返回给我们的信息中提取我们想要数据的过程。其实使用正则表达式提取我们要的标题的过程也可以称为网页解析。
因为当前绝大多数网页源代码都是用HTML语言写的,而HTML语言时特别有规律性的,比如我们要的所有文章标题都具有相同结构,也就是说它周围的字符串都是十分类似的,这样我们能够批量获取。所以就有大鳄专门封装了怎样从HTML代码中提取特定文本的库,也就是我们平常说的网页解析库,如bs4 lxml pyquery等,其实把她们当作处理字符串的就可以了。
为了更清楚地了解怎样对网页进行解析,我们须要先简略把握HTML代码的结构。
引用维基百科中的一段话来介绍HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被诸多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面[1]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。
为了使读者对HTML有更清楚的认识,我们来写一点简单的HTML代码。用文本编辑器(记事本也可以)创建一个名子为a.html的文件,在里面写下如下代码
<!DOCTYPE html>
<html>
<head>
<title>爬虫基本原理</title>
</head>
<body>
<h1>HTML介绍</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你双击这个文件,就会手动用浏览器打开,然后你还能见到下边这个样子的页面
你若果根据我的操作来做的话,你已然创建了一个简单的网页,现在你看见的所有网页都是这样设计的,只是比你的复杂一点而已,不信你去瞧瞧刚刚截图出来的网页源代码图片。
接下来,我们来看一下HTML语言的特性。最重要的一点是网页爬虫,文本都是被标签(h1标签 p标签)夹在中间的,而这种标签都是特定的,有专门用途的。比如<h1>就表示一级标题,包在上面的文本自然会被放大显示;而<p>标签则表示段落。
再看里面的源代码截图,head meta script title div li每一个都是标签,层层嵌套。我们完全不需要晓得总共有什么种标签,也不需要晓得这种标签都是拿来干哪些的,我们只要找到我们要的信息包含在哪些标签里就行了。比如使用正则表达式就直接用<p>(.*?)</p>就可以把上面的内容提取下来了。
但是事实似乎没有这么简单,看里面的截图标签如何是这样的<nav id="nav" class="clearfix">?其实这是一个<nav>标签,后面的id class是这个标签的属性。
为什么要给标签设置属性呢?我们先考虑这样一个问题:我们看见的网页千差万别,文字的颜色字体等都不一样,这是如何设置的呢?答案是使用css样式。
css句子类似这样
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即设置对应标签的颜色、字体、大小、居中等。而当有的段落使用这个字体,有的段落使用哪个字体如何办呢?css这样设置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代码中则这样写
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同属性就是为了分辨相同标签用的,这相当于给标签进行了分类,在统一设计款式上更方便,同时对于我们依照属性定位我们想要内容的位置虽然也是更方便了。这里要说明一下,class id这两个属性比较特殊,用的也最多,所以各自弄了一个快捷键来表示,class用.,id用#。
做爬虫不需要了解刚才编撰的css代码内容放到那里之类的问题,也不需要了解css代码设置了哪些,我们只会和HTML打交道,所以只要理解HTML中属性的作用就可以了。
如果想要更进一步了解HTML和CSS,可以到w3school网站学习。
现在你就早已具备了解析网页须要的全部HTML知识了。我们通常就是依据标签名配合属性值来定位我们想要资源的位置的,其他的都不用管。这时,我们再来看爬虫的解析代码
把上面的代码再粘贴一遍如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解释一下里面代码的过程
可以看见里面的代码十分简约,思路清晰,读者可以自己想一想假如要用正则表达式怎么匹配那些标签,会发觉代码冗长好多,虽然它也有更快的优势。
那么我们是如何晓得要找寻什么样属性的div标签,为什么要找h2 a标签而不是其他的呢?这就要去剖析网页的源代码了。而这个过程也十分简单。
我们如今用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-查看网页源代码,这时才会打开一个新的页面这个页面就是这个网站的HTML源代码了,我们可以通过这个页面来看我们要的信息在那里,但是觉得十分不便捷,因为有太多无用的信息做干扰,我们难以快速掌控网页的结构。所以我们可以用另一种形式查看源代码。
用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-检查,就会弹出一个框,如下图所示
(如果没有听到这个界面,注意要切换到Element中)
这个页面最大的用处是通过折叠来使人更快探求出网页的结构。
其中的这些代码就是HTML代码,该页面的一个个标题就存在这一个个li上面。点击li后面的三角就可以展开具体的代码内容,如下图所示
可以看见文章的标题(打造一个高性能、易落地的公链开发平台)就在这个源代码之中,也就是说在我们刚才获得的r.text字符串之中。而我们代码定位路径也一目了然了,因为每位li上面还会有一个<div class="title">而每一个div上面还会有一个h2 里面有一个a,a中包含我们要的标题名称。所以我们就用find_all找到所有这样的div标签,存储为一个list,再对list进行循环,对每一个元素提取h2 a 再提取标签中的内容。
当然我们也可以find_all最外边的li标签,再一层层往里找,都是一样的。只要找到定位信息的惟一标示(标签或则属性)就可以了。
虽然在这里看源代码可以折叠一些没用的代码,但是虽然还有一些更好用的工具来辅助我们找到我们要的信息在网页源码中的位置。比如下边这个键盘符号。
在所有代码都折叠上去的情况下,点击这个键盘,之后再去点击网页中的元素,浏览器都会手动帮你把你点击的元素选中下来,其实你键盘悬在一个元素前面的时侯,就早已帮你定位了,如下图所示
当我们要爬一个网页的时侯,只须要如下流程
现在,对于一些没有丝毫反爬举措的网站我们都可以游刃有余了。至于抓取多个数组的数据怎么组织在一起、抓取多页(URL有规律的情况下)的代码怎样设计,就不是爬虫知识范畴了,这是用python基础知识就可以解决的。下一系列文章就主要讲这一部分。接下来给几个当前可以练手的网站
如果使用BeautifulSoup的定位的过程中遇见困难,可以直接到网上搜教程,也可以等我们这个专题前面更新的BeautifulSoup详尽介绍。
如果你去抓取其他网站,最好先看一下r.text是不是和网站源代码一模一样,如果不是,说明你对方服务器没有把真正的信息给你,说明他可能看出你是爬虫了(进行网页恳求的时侯,浏览器和requests.get都相当于带着一堆资格证去敲门,对方会检测你这种资格证,浏览器的资格证通常是可以通过的,而代码的资格证就可能不合格,因为代码的资格证可能有一些比较固定的特征,对方服务器预先设定好,资格证是这样的恳求一律拒绝,因为她们一定是爬虫,这就是反爬虫机制),这时就须要懂一些反反爬举措就能获得真正的信息,反反爬方式的学习是一个积累的过程,我们前面再讲。读者假如遇见一些反爬机制,可以到网上查这个网站的爬虫,估计都能查到一些博客讲怎么破解,甚至直接贴出代码。
在这篇的基础上抓取多页以及代码设计的改进看下边这三篇续集
爬虫代码改进(一)
爬虫代码改进(二)
爬虫代码改进(三)
专栏主页:python编程
专栏目录:目录
爬虫目录:爬虫系列目录
版本说明:软件及包版本说明 查看全部
这篇文章的定位是,给有一些python基础,但是对爬虫一无所知的人写的。文中只会涉及到爬虫最核心的部份,完全避免莫名其妙的坑或概念,让读者认为爬虫是一件极其简单的事情,而事实上爬虫确实是一件极其简单的事情(如果你不是以爬虫为工作的话)。
本文分为如下几个部份
简单理解网路爬虫就是手动抓取网页信息的代码,可以简单理解成取代繁杂的复制粘贴操作的手段。
首先必须申明,爬虫的对象必须是你早已听到的网页,比如你不能说你想找到知乎上那个用户的关注人数最多,就希望通过写一个爬虫来帮你爬到答案。你必须明晰地晓得这个人,找到他的主页,然后才会用爬虫来抓取他页面上的信息。
下面我们用一个简单的事例来展示爬虫的工作流程。感觉多数教程第一篇都使用的是豆瓣top250,我们这儿换一个,抓取CSDN首页的文章标题,链接在这里,页面样子是这样的

抓取标题完整代码如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
这样才会复印出所有标题,展示一部分如下

上述过程是一个最简单的完整爬虫流程,可以看出它的功能就是把这些标题复制粘贴到一起,免不仅自动操作的冗长。其实爬虫通常就是做这些事的,比如我们须要用链家的数据进行剖析,看到链家的页面是这样的

我们想获取每位房屋的标题、几室几厅、多少平米、朝向、装修、价格等等数组(即指标),就可以通过爬虫进行定位,自动化抓取这100页所有房屋的那些数组信息。比如100页里有2000个房屋,总共抓取10个数组,爬虫运行结束就可以得到一个2000行10列的excel表格。
注:如果还没有安装里面两个库的读者可以在命令行下分别运行下边两行命令完成安装
pip install requests
pip install beautifulsoup4
知道了爬虫是拿来干哪些的以后,我们来介绍一些最常见到的概念
1.URL
URL英文称为统一资源定位符,其实可以理解成网页的链接,比如前面的就是一个URL。
但是更广义的URL不只是我们常听到的网页资源链接,而是资源在网页中的定位标示。我们一般说的网页是一个资源,网页中加载的每一张图片也是一个资源,它们在互联网中也有惟一的定位URL。比如我们从CSDN网页上随意找一张图片

这个链接就是这个图片资源的定位符,将这个链接输入浏览器中都会显示出这张图片网页爬虫,所以说这张图片也对应一个URL。
不过晓得如此回事就好,我们一般所说的传入URL指的就是把网页的链接传进去。上面代码中
r = requests.get('https://www.csdn.net/')
就是在将URL传入恳求函数。
2.网页恳求
说到网页恳求,就有必要讲一下我们平时浏览网页时,信息交互的模式大约是什么样的。我们平时用浏览器浏览网页的时侯,鼠标点了一个链接,比如你如今点击这儿,其实浏览器帮你向这个网页发送了恳求(request),维护网页的服务器(可以理解为CSDN公司里的一台笔记本,在维护这CSDN上的各个网页)收到了这个恳求,判定这个恳求是有效的,于是返回了一些响应信息(response)到浏览器,浏览器将这种信息进行渲染(可以理解成 处理成人能读懂的样子),就是你看见的网页的样子了。发送恳求与接收恳求的过程就和 发陌陌和收到回复的过程类似。
而如今我们要用代码来模拟滑鼠点击的过程。上面的requests.get就是使代码帮你向这个网页发送了这个恳求,如果恳求被判断为有效,网页的服务器也会把信息传送给你,传送回去的这种信息就被形参到变量r之中。所以这个变量r里就包含有我们想要的信息了,也包括这些我们想要提取的标题。
我们可以print(r.text)看一下上面有哪些东西

我们再看一下网页的源代码(如何读懂这个源码,以及这个源码如何查看下一节HTML会详尽提到)

源代码和r.text虽然是一模一样的东西。r.text虽然就是一个字符串,字符串中有我们刚才抓取到的所有标题,我们只要通过字符串匹配方式(比如正则表达式)将她们提取下来就可以了。这样说是不是觉得爬虫十分简单呢?只要这样傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接从r.text字符串中提取信息即可。其实爬虫就是那么简单。
但是解析是如何回事呢,为什么刚才不直接用正则而要用bs4呢?因为便捷,但是正则也是完全可以的,只是相对麻烦一些、需要写更多的代码而已。
3.网页解析
网页解析虽然就从网页服务器返回给我们的信息中提取我们想要数据的过程。其实使用正则表达式提取我们要的标题的过程也可以称为网页解析。
因为当前绝大多数网页源代码都是用HTML语言写的,而HTML语言时特别有规律性的,比如我们要的所有文章标题都具有相同结构,也就是说它周围的字符串都是十分类似的,这样我们能够批量获取。所以就有大鳄专门封装了怎样从HTML代码中提取特定文本的库,也就是我们平常说的网页解析库,如bs4 lxml pyquery等,其实把她们当作处理字符串的就可以了。
为了更清楚地了解怎样对网页进行解析,我们须要先简略把握HTML代码的结构。
引用维基百科中的一段话来介绍HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被诸多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面[1]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。
为了使读者对HTML有更清楚的认识,我们来写一点简单的HTML代码。用文本编辑器(记事本也可以)创建一个名子为a.html的文件,在里面写下如下代码
<!DOCTYPE html>
<html>
<head>
<title>爬虫基本原理</title>
</head>
<body>
<h1>HTML介绍</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你双击这个文件,就会手动用浏览器打开,然后你还能见到下边这个样子的页面

你若果根据我的操作来做的话,你已然创建了一个简单的网页,现在你看见的所有网页都是这样设计的,只是比你的复杂一点而已,不信你去瞧瞧刚刚截图出来的网页源代码图片。
接下来,我们来看一下HTML语言的特性。最重要的一点是网页爬虫,文本都是被标签(h1标签 p标签)夹在中间的,而这种标签都是特定的,有专门用途的。比如<h1>就表示一级标题,包在上面的文本自然会被放大显示;而<p>标签则表示段落。
再看里面的源代码截图,head meta script title div li每一个都是标签,层层嵌套。我们完全不需要晓得总共有什么种标签,也不需要晓得这种标签都是拿来干哪些的,我们只要找到我们要的信息包含在哪些标签里就行了。比如使用正则表达式就直接用<p>(.*?)</p>就可以把上面的内容提取下来了。
但是事实似乎没有这么简单,看里面的截图标签如何是这样的<nav id="nav" class="clearfix">?其实这是一个<nav>标签,后面的id class是这个标签的属性。
为什么要给标签设置属性呢?我们先考虑这样一个问题:我们看见的网页千差万别,文字的颜色字体等都不一样,这是如何设置的呢?答案是使用css样式。
css句子类似这样
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即设置对应标签的颜色、字体、大小、居中等。而当有的段落使用这个字体,有的段落使用哪个字体如何办呢?css这样设置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代码中则这样写
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同属性就是为了分辨相同标签用的,这相当于给标签进行了分类,在统一设计款式上更方便,同时对于我们依照属性定位我们想要内容的位置虽然也是更方便了。这里要说明一下,class id这两个属性比较特殊,用的也最多,所以各自弄了一个快捷键来表示,class用.,id用#。
做爬虫不需要了解刚才编撰的css代码内容放到那里之类的问题,也不需要了解css代码设置了哪些,我们只会和HTML打交道,所以只要理解HTML中属性的作用就可以了。
如果想要更进一步了解HTML和CSS,可以到w3school网站学习。
现在你就早已具备了解析网页须要的全部HTML知识了。我们通常就是依据标签名配合属性值来定位我们想要资源的位置的,其他的都不用管。这时,我们再来看爬虫的解析代码
把上面的代码再粘贴一遍如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
# 传入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解释一下里面代码的过程
可以看见里面的代码十分简约,思路清晰,读者可以自己想一想假如要用正则表达式怎么匹配那些标签,会发觉代码冗长好多,虽然它也有更快的优势。
那么我们是如何晓得要找寻什么样属性的div标签,为什么要找h2 a标签而不是其他的呢?这就要去剖析网页的源代码了。而这个过程也十分简单。
我们如今用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-查看网页源代码,这时才会打开一个新的页面这个页面就是这个网站的HTML源代码了,我们可以通过这个页面来看我们要的信息在那里,但是觉得十分不便捷,因为有太多无用的信息做干扰,我们难以快速掌控网页的结构。所以我们可以用另一种形式查看源代码。
用谷歌浏览器打开CSDN这个网站,找一个空白的位置右键-检查,就会弹出一个框,如下图所示

(如果没有听到这个界面,注意要切换到Element中)
这个页面最大的用处是通过折叠来使人更快探求出网页的结构。
其中的这些代码就是HTML代码,该页面的一个个标题就存在这一个个li上面。点击li后面的三角就可以展开具体的代码内容,如下图所示

可以看见文章的标题(打造一个高性能、易落地的公链开发平台)就在这个源代码之中,也就是说在我们刚才获得的r.text字符串之中。而我们代码定位路径也一目了然了,因为每位li上面还会有一个<div class="title">而每一个div上面还会有一个h2 里面有一个a,a中包含我们要的标题名称。所以我们就用find_all找到所有这样的div标签,存储为一个list,再对list进行循环,对每一个元素提取h2 a 再提取标签中的内容。
当然我们也可以find_all最外边的li标签,再一层层往里找,都是一样的。只要找到定位信息的惟一标示(标签或则属性)就可以了。
虽然在这里看源代码可以折叠一些没用的代码,但是虽然还有一些更好用的工具来辅助我们找到我们要的信息在网页源码中的位置。比如下边这个键盘符号。

在所有代码都折叠上去的情况下,点击这个键盘,之后再去点击网页中的元素,浏览器都会手动帮你把你点击的元素选中下来,其实你键盘悬在一个元素前面的时侯,就早已帮你定位了,如下图所示

当我们要爬一个网页的时侯,只须要如下流程
现在,对于一些没有丝毫反爬举措的网站我们都可以游刃有余了。至于抓取多个数组的数据怎么组织在一起、抓取多页(URL有规律的情况下)的代码怎样设计,就不是爬虫知识范畴了,这是用python基础知识就可以解决的。下一系列文章就主要讲这一部分。接下来给几个当前可以练手的网站
如果使用BeautifulSoup的定位的过程中遇见困难,可以直接到网上搜教程,也可以等我们这个专题前面更新的BeautifulSoup详尽介绍。
如果你去抓取其他网站,最好先看一下r.text是不是和网站源代码一模一样,如果不是,说明你对方服务器没有把真正的信息给你,说明他可能看出你是爬虫了(进行网页恳求的时侯,浏览器和requests.get都相当于带着一堆资格证去敲门,对方会检测你这种资格证,浏览器的资格证通常是可以通过的,而代码的资格证就可能不合格,因为代码的资格证可能有一些比较固定的特征,对方服务器预先设定好,资格证是这样的恳求一律拒绝,因为她们一定是爬虫,这就是反爬虫机制),这时就须要懂一些反反爬举措就能获得真正的信息,反反爬方式的学习是一个积累的过程,我们前面再讲。读者假如遇见一些反爬机制,可以到网上查这个网站的爬虫,估计都能查到一些博客讲怎么破解,甚至直接贴出代码。
在这篇的基础上抓取多页以及代码设计的改进看下边这三篇续集
爬虫代码改进(一)
爬虫代码改进(二)
爬虫代码改进(三)
专栏主页:python编程
专栏目录:目录
爬虫目录:爬虫系列目录
版本说明:软件及包版本说明
了解网页结构
采集交流 • 优采云 发表了文章 • 0 个评论 • 248 次浏览 • 2020-05-08 08:01
学习爬虫, 首先要懂的是网页. 支撑起各类光鲜亮丽的网页的不是别的, 全都是一些代码.这种代码我们称之为 HTML,HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这些语言转换成我们用肉眼见到的网页.所以 HTML 里面必将存在着好多规律, 我们的爬虫还能根据这样的规律来爬取你须要的信息.
其实不仅 HTML, 一同打造多彩/多功能网页的组件还有 CSS 和. 但是这个简单的爬虫教程,大部分时间会将会使用 HTML.CSS 和 JavaScript 会在后期简单介绍一下. 因为爬网页的时侯多多少少还是要和 CSS JavaScript 打交道的.
虽然莫烦Python主打的是机器学习的教程. 但是这个爬虫教程适用于任何想学爬虫的朋友们.从机器学习的角度看爬虫结构, 机器学习中的大量数据, 也是可以从这种网页中来, 使用爬虫来爬取各类网页里面的信息, 然后再装入各类机器学习的方式,这样的应用途径正在越来越多被采用. 所以假如你的数据也是分散在各个网页中, 爬虫是你降低人力劳动的必修课.
网页基本组成部分
在真正步入爬虫之前, 我们先来做一下热身运动, 弄明白网页的基础, HTML 有什么组成部分,是怎么样运作的. 如果你早已十分熟悉网页的构造了, 欢迎直接跳过这一节, 进入下边的学习.
我制做了一个特别简易的网页, 给你们呈现以下最肉感的 HTML 结构.如果你点开它, 呈现在你眼前的, 就是下边这张图的上半部份. 而下半部份就是我们网页背后的 HTML code.
想问我是怎么见到 HTML 的 source code 的? 其实很简单, 在你的浏览器中 (我用的是 Google Chrome),显示网页的地方, 点击滑鼠右键,大多数浏览器就会有类似这样一个选项 “View Page Source”. 点击它能够看见页面的源码了.
在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的方式, 或有不同的功能.主体的 tag 分成两部份, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看见的网页中的.这些信息大多数时侯是给浏览器看, 或者是给搜索引擎的爬虫看.
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
HTML 的第二大块是 body, 这个部份才是你看见的网页信息. 网页中的 heading, 视频, 图片和文字等都储存在这里.这里的 <h1></h1> tag 就是主标题, 我们看见呈现下来的疗效就是大一号的文字. <p></p> 里面的文字就是一个段落.<a></a>里面都是一些链接. 所以好多情况, 东西都是置于这种 tag 中的.
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
爬虫想要做的就是按照这种 tag 来找到合适的信息.
用 Python 登录网页
好了, 对网页结构和 HTML 有了一些基本认识之后, 我们能够用 Python 来爬取这个网页的一些基本信息.首先要做的, 是使用 Python 来登入这个网页, 并复印出这个网页 HTML 的 source code.注意, 因为网页中存在英文, 为了正常显示英文, read() 完之后, 我们要对读下来的文字进行转换, decode() 成可以正常显示英文的方式.
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
print 出来就是下边这样啦. 这就证明了我们能否成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和借助.我们发觉, 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
</html>
匹配网页内容
所以这儿我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 我有一个很不错的正则表达式的教程,如果是中级的网页匹配, 我们使用正则完全就可以了, 高级一点或则比较冗长的匹配, 我还是推荐使用 BeautifulSoup.不急不急, 我知道你想偷懒, 我然后马上还会教 beautiful soup 了. 但是如今我们还是使用正则来做几个简单的事例, 让你熟悉一下套路.
如果我们想用代码找到这个网页的 title, 我们能够这样写. 选好要使用的 tag 名称 <title>. 使用正则匹配.
import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫烦Python
如果想要找到中间的那种段落 <p>, 我们使用下边方式, 因为这个段落在 HTML 中还参杂着 tab, new line, 所以我们给一个flags=re.DOTALL 来对那些 tab, new line 不敏感.
res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到笔记本里,就靠这样的途径了.
res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
下次我们就来瞧瞧为了图方面爬虫结构, 我们怎样使用 BeautifulSoup.
相关教程 查看全部
学习资料:
学习爬虫, 首先要懂的是网页. 支撑起各类光鲜亮丽的网页的不是别的, 全都是一些代码.这种代码我们称之为 HTML,HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这些语言转换成我们用肉眼见到的网页.所以 HTML 里面必将存在着好多规律, 我们的爬虫还能根据这样的规律来爬取你须要的信息.
其实不仅 HTML, 一同打造多彩/多功能网页的组件还有 CSS 和. 但是这个简单的爬虫教程,大部分时间会将会使用 HTML.CSS 和 JavaScript 会在后期简单介绍一下. 因为爬网页的时侯多多少少还是要和 CSS JavaScript 打交道的.

虽然莫烦Python主打的是机器学习的教程. 但是这个爬虫教程适用于任何想学爬虫的朋友们.从机器学习的角度看爬虫结构, 机器学习中的大量数据, 也是可以从这种网页中来, 使用爬虫来爬取各类网页里面的信息, 然后再装入各类机器学习的方式,这样的应用途径正在越来越多被采用. 所以假如你的数据也是分散在各个网页中, 爬虫是你降低人力劳动的必修课.
网页基本组成部分
在真正步入爬虫之前, 我们先来做一下热身运动, 弄明白网页的基础, HTML 有什么组成部分,是怎么样运作的. 如果你早已十分熟悉网页的构造了, 欢迎直接跳过这一节, 进入下边的学习.
我制做了一个特别简易的网页, 给你们呈现以下最肉感的 HTML 结构.如果你点开它, 呈现在你眼前的, 就是下边这张图的上半部份. 而下半部份就是我们网页背后的 HTML code.

想问我是怎么见到 HTML 的 source code 的? 其实很简单, 在你的浏览器中 (我用的是 Google Chrome),显示网页的地方, 点击滑鼠右键,大多数浏览器就会有类似这样一个选项 “View Page Source”. 点击它能够看见页面的源码了.

在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的方式, 或有不同的功能.主体的 tag 分成两部份, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看见的网页中的.这些信息大多数时侯是给浏览器看, 或者是给搜索引擎的爬虫看.
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
HTML 的第二大块是 body, 这个部份才是你看见的网页信息. 网页中的 heading, 视频, 图片和文字等都储存在这里.这里的 <h1></h1> tag 就是主标题, 我们看见呈现下来的疗效就是大一号的文字. <p></p> 里面的文字就是一个段落.<a></a>里面都是一些链接. 所以好多情况, 东西都是置于这种 tag 中的.
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
爬虫想要做的就是按照这种 tag 来找到合适的信息.
用 Python 登录网页
好了, 对网页结构和 HTML 有了一些基本认识之后, 我们能够用 Python 来爬取这个网页的一些基本信息.首先要做的, 是使用 Python 来登入这个网页, 并复印出这个网页 HTML 的 source code.注意, 因为网页中存在英文, 为了正常显示英文, read() 完之后, 我们要对读下来的文字进行转换, decode() 成可以正常显示英文的方式.
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/s ... ot%3B
).read().decode('utf-8')
print(html)
print 出来就是下边这样啦. 这就证明了我们能否成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和借助.我们发觉, 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/s ... gt%3B
</head>
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
</p>
</body>
</html>
匹配网页内容
所以这儿我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 我有一个很不错的正则表达式的教程,如果是中级的网页匹配, 我们使用正则完全就可以了, 高级一点或则比较冗长的匹配, 我还是推荐使用 BeautifulSoup.不急不急, 我知道你想偷懒, 我然后马上还会教 beautiful soup 了. 但是如今我们还是使用正则来做几个简单的事例, 让你熟悉一下套路.
如果我们想用代码找到这个网页的 title, 我们能够这样写. 选好要使用的 tag 名称 <title>. 使用正则匹配.
import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫烦Python
如果想要找到中间的那种段落 <p>, 我们使用下边方式, 因为这个段落在 HTML 中还参杂着 tab, new line, 所以我们给一个flags=re.DOTALL 来对那些 tab, new line 不敏感.
res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
# <a href="https://morvanzhou.github.io/t ... gt%3B爬虫教程</a> 中的简单测试.
最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到笔记本里,就靠这样的途径了.
res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
下次我们就来瞧瞧为了图方面爬虫结构, 我们怎样使用 BeautifulSoup.
相关教程