linux网页抓取-2

五、解析网页源代码,得到所需要信息

解析html并不复杂,只是有点麻烦而已。因为页面不可能全部读入内存在解析,只有分开读。分开读就必须要考虑需要查找的标签有可能只读到一部分这种情况。如读1024字节数据,我需要在里面找<div class="article_title">,碰巧的是,1024字节数据最后几位是<div class.在这种情况下,我不能简单的说1024字节里没有我所需要的,那就丢掉这1024字节。这样导致的后果解析出来的文章有遗漏。
需要解析的标签如下:
  1. #define ARTICLE_TITLE ("<div class=\"article_title\">")  
  2. #define ARTICLE_MANAGE ("<div class=\"article_manage\">")  
  3. #define BLOG_TITLE ("<div class=\"blog_title\">")  
  4. #define URL_LINK ("<a href=")  
  5. #define LINK_TITLE ("<span class=\"link_title\"><a href=")  
  6. #define LINK_TITLE_END ("</a></span>")  
  7. #define LINK_VIEW ("<span class=\"link_view\"")  
  8. #define LINK_COMMENTS ("<span class=\"link_comments\"")  
  9. #define LINK_POSTDATE ("<span class=\"link_postdate\">")  
  10. #define BLOG_RANK ("<ul id=\"blog_rank\">")  
  11. #define BLOG_STATISTICES (" <ul id=\"blog_statistics\">")  
  12. #define URL_END ("</a>")  
  13. #define DIV_END ("</div>")  
  14. #define SPAN ("<span>")  
  15. #define SPAN_END ("</span>")  
  16. #define UL_END  ("</ul>")  
我的解析流程图如下所示,有待优化。



1、从保存的首页中读1024字节到数组。
2、strcat到2048个字节的数组,多定义一个2048字节的数组,就是为了解决查找标签有可能只读到一部分的情况。
3、判断状态,自定义5个状态

 

  1. #define TAG_RESOLV_ARTICLE 0  //解析文章标题、URL  
  2. #define TAG_RESOLV_ARTICLE_STATIS 1//解析文章访问信息  
  3. #define TAG_RESOLV_RANK 2//解析博主博客的访问信息  
  4. #define TAG_RESOLV_STATIS 3//解析博主文章统计  
  5. #define TAG_RESOLV_END 4//解析结束  

4、根据状态查找相应的标签位置。

   如果状态为TAG_RESOLV_RANK,则查找<ulid="blog_rank">和</ul>是否在数组中。只有两个标签同时在数组中,才解析标签所包含的有用信息。当<ulid="blog_rank">存在,而</ul>不存在时,则丢掉<ulid="blog_rank">之前的数据,在读1024字节数据后在解析。引用我自己写的一段代码来分析一下。

  1. /* 
  2. *功能:解析博客排名,访问量等。 
  3. */  
  4. int resolvBlogRank(char *buf, int len, struct BloggerInfo *blogger, int *tag) {  
  5.     char *blog_rank_start, *blog_rank_end, *span_start, *span_end;  
  6.     char tmpbuf[BUFFERLEN * 2];  
  7.     int roll_back_loc,buf_len;  
  8.     bzero(tmpbuf, sizeof (tmpbuf));  
  9.     blog_rank_start = strstr(buf, BLOG_RANK);//找到BLOG_RANK第一次出现的位置(呵呵,只会出现一次)  
  10.     if (blog_rank_start == 0) {//如果buf数组里面没有出现BLOG_RANK,则只保留buf数组最后200个字节。为什么是200?主要是因为BLOG_RANK所包括的字符长度目前不会超过200哈。  
  11.         buf_len=strlen(buf);  
  12.         roll_back_loc=buf_len-200>0?buf_len-200:0;  
  13.         strcat(tmpbuf, buf + roll_back_loc);  
  14.         bzero(buf, len);  
  15.         strcat(buf, tmpbuf);  
  16.     } else {//BLOG_RANK出现在buf里面  
  17.         blog_rank_end = strstr(blog_rank_start + strlen(BLOG_RANK), UL_END);//找与<span style="white-space: pre-wrap; ">BLOG_RANK对应的结尾标签,这里是</ul></span>  
  18.         if (blog_rank_end == 0) {//UL标签没有找到,则保留BLOG_RANK之后的数据  
  19.             strcat(tmpbuf, blog_rank_start);  
  20.             bzero(buf, len);  
  21.             strcat(buf, tmpbuf);  
  22.         } else {//UL标签找到  
  23.             span_start = strstr(blog_rank_start + strlen(BLOG_RANK), SPAN);  
  24.             span_end = strstr(span_start + strlen(SPAN), SPAN_END);  
  25.             blogger->visits = myatoi(span_start + strlen(SPAN), span_end);//myatoi函数是我自己写的,用于将字符串转换为整数。如“第10000名”=》10000  
  26.             span_start = strstr(span_end + strlen(SPAN_END), SPAN);  
  27.             span_end = strstr(span_start + strlen(SPAN), SPAN_END);  
  28.             blogger->integral = myatoi(span_start + strlen(SPAN), span_end);  
  29.             span_start = strstr(span_end + strlen(SPAN_END), SPAN);  
  30.             span_end = strstr(span_start + strlen(SPAN), SPAN_END);  
  31.             blogger->ranking = myatoi(span_start + strlen(SPAN), span_end);  
  32.             *tag = TAG_RESOLV_STATIS;  
  33.             strcat(tmpbuf, blog_rank_end + strlen(UL_END));  
  34.             bzero(buf, len);  
  35.             strcat(buf, tmpbuf);  
  36.         }  
  37.     }  
  38.     return 0;  
  39. }  

5、循环,直到所解析的内容解析完毕

、根据解析出来的文章URL,发送HTTP请求,保存返回的网页源代码

我是以文章名作为文件的名字,这里需要注意一个问题,当文件名出现/时,必须把文件名中的/替换为别的符号,我是替换为_符号。因为/在linux中属于路径的一部分。

至此,linux网页抓取工具就宣告完毕。


接下来的工作:

1.网页抓取是单线程的,接下来会采用多线程模式。
2.网页抓取没有抓取图片。js,css,所以在有网络的情况下才能呈现该有的样子。
3.代码很多地方需要优化,有的地方有点乱。
4.准备做个windows版本。不考虑做界面。
5.揉和window版本和linux版本,做个通用版。其实通用版还不是不同操作系统调用不同的函数而已。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫可以用来抓取网站上的图片,而在Linux系统上,可以使用Python的requests和BeautifulSoup库来实现。具体步骤如下: 1. 安装Python和相关库:在Linux系统上安装Python和requests、BeautifulSoup库。 2. 编写Python脚本:使用Python编写脚本,使用requests库获取网页内容,使用BeautifulSoup库解析网页内容,找到图片链接并下载图片。 3. 运行Python脚本:在Linux系统上运行Python脚本,即可抓取网站上的图片。 需要注意的是,在抓取图片时,需要注意网站的版权问题,避免侵犯他人的权益。 ### 回答2: Python爬虫是利用编写程序自动抓取互联网上的数据,包括文本、数据和图片等网页元素。而在Linux操作系统下,Python爬虫抓取图片的方法如下: 一、安装Python 首先,需要安装Python解释器,推荐使用Python3版本,安装方法如下: 命令行输入 sudo apt-get install python3 二、安装Python的第三方库 在Python标准库中,虽然已经提供了许多内置库,但常用的许多功能并不包含在其中。因此需要安装使用第三方库。 推荐使用Requests和BeautifulSoup两个库,分别用以发起网络请求和解析HTML文档。安装方法如下: 命令行输入 sudo pip3 install requests BeautifulSoup4 三、编写Python爬虫抓取图片程序 使用Python编写爬虫程序来抓取图片,需要先了解如何通过网络请求获取图片的URL,并下载并保存图片文件。 具体步骤如下: 1.设置目标网站的URL地址,即图片所在的页面 2.利用Requests库获取该网站的HTML文档 3.利用BeautifulSoup库解析该HTML文档,找到所有图片的URL链接 4.对于每个图片URL链接,利用Requests库下载该图片,并保存到本地 示例代码如下: import requests from bs4 import BeautifulSoup #设置目标URL url = 'https://www.example.com/' #发起网络请求,获取网站HTML文档 response = requests.get(url) html_content = response.content #解析HTML文档,找到所有图片的URL链接 soup = BeautifulSoup(html_content) img_links = [] for img in soup.find_all('img'): img_links.append(img['src']) #下载并保存所有图片 for link in img_links: img_response = requests.get(link) img_content = img_response.content file_path = './images/' + link.split('/')[-1] with open(file_path, 'wb') as f: f.write(img_content) 总之,在Linux上使用Python爬虫抓取图片,关键是使用Requests库进行网络请求和BeautifulSoup库解析HTML文档,然后将图片保存到本地即可。 ### 回答3: Python是一种高级编程语言,被广泛用于数据分析、人工智能、机器学习和爬虫等方面。Python爬虫技术可以用于抓取网站上的各种数据,并且Linux作为一个开源的操作系统,拥有强大的网络功能和工具,因此,在Python爬虫抓取图片方面,Linux一个非常适合使用的操作系统。 首先,我们需要安装Python的相关库,如requests、bs4、selenium等。其中,requests是用于发送HTTP请求的库,bs4是用于解析HTML和XML文档的库,selenium是一个自动化测试工具,可以用于模拟浏览器行为进行网页爬取。这些库可以通过pip命令进行安装。 其次,我们需要使用Python爬虫代码实现从网站上抓取图片。最常用的方法是通过解析HTML文档中的图片地址,使用requests库下载图片并保存到本地。 另外,还可以使用selenium模拟浏览器行为进行图片抓取,这种方法可以解决由于网站反爬虫机制而导致的无法访问图片的问题。 最后,在Linux操作系统上,我们可以使用命令行工具进行Python爬虫的运行和管理。可以使用crontab命令进行定时任务的设置,让爬虫自动定期运行。同时,我们还可以使用Linux操作系统提供的一些工具对爬虫程序进行监控和管理,如systemd服务和systemctl命令。 综上所述,Python爬虫抓取图片在Linux操作系统上是非常方便和实用的。通过合理的运用Python爬虫技术和Linux操作系统提供的工具,我们可以轻松完成各种网站图片的抓取任务,并且可以节省时间和精力,提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值