爬虫问题解决的相关问题

  继续上一篇文章的内容,上一篇文章中已经将url管理器和下载器写好了。接下来就是url解析器,总的来说这个模块是几个模块中比较难的。因为通过下载器下载完页面之后,我们虽然得到了页面,但是这并不是我们想要的结果。而且由于页面的代码很多,我们很难去里面找到自己想要的数据。所幸,我们下载的是html页面,它是一种由多个多层次的节点组成的树型结构的文本文件。所以,相较于txt文件,我们更加容易定位到我们要找的数据块。现在我们要做的就是去原页面去分析一下,我们想要的数据到底在哪。

  打开百度百科pyton词条的页面,然后按F12调出开发者工具。通过使用工具,我们就能定位到页面的内容:

爬虫问题解决的相关问题

爬虫问题解决的相关问题

  这样我们就找到了我们想要的信息处在哪个标签里了。

 1 import bs4 2 import re 3 from urllib.parse import urljoin 4 class HtmlParser(object): 5     """docstring for HtmlParser""" 6     def _get_new_urls(self, url, soup): 7         new_urls = set() 8         links = soup.find_all('a', href = re.compile(r'/item/.')) 9         for link in links:10             new_url = re.sub(r'(/item/)(.*)', r'%s' % link.getText(), link['href'])11             new_full_url = urljoin(url, new_url)12             new_urls.add(new_full_url)13         return new_urls14 15     def _get_new_data(self, url, soup):16         res_data = {}17         #url18         res_data['url'] = url19         #
20 title_node = soup.find('dd', class_ = "lemmaWgt-lemmaTitle-title").find('h1')21 res_data['title'] = title_node.getText()22 #
23 summary_node = soup.find('div', class_ = "lemma-summary")24 res_data['summary'] = summary_node.getText()25 return res_data26 27 def parse(self, url, html_cont):28 if url is None or html_cont is None:29 return 30 soup = bs4.BeautifulSoup(html_cont, 'lxml')31 new_urls = self._get_new_urls(url, soup)32 new_data = self._get_new_data(url, soup)33 return new_urls, new_data

登录后复制

  解析器只有一个外部方法就是parse方法,

    a.首先它会接受url, html_cont两个参数,然后进行判断页面内容是否为空

    b.调用bs4模块的方法来解析网页内容,’lxml’为文档解析器,默认的为html.parser,bs官方推荐我们用lxml,那就听它的吧,谁让人家是官方呢。

    c.接下来就是调用两个内部函数来获取新的url列表和数据

    d.最后将url列表和数据返回

  这里有一些注意点

    1.bs的方法调用还有一个参数,from_encoding 这个和我在下载器那里的重复了,所以我就取消了,两个的功能是一样的。

    2.获取url列表的内部方法,需要用到正则表达式,这里我也是摸着石头过河,不是很会,中间也调试过许多次。

    3.数据是放在字典中的,这样可以通过key来增改删除数据。

 

最好,就直接数据输出了,这个比较简单,直接上代码。

  

 1 class HtmlOutputer(object): 2     """docstring for HtmlOutputer""" 3     def __init__(self): 4         self.datas = [] 5     def collect_data(self, new_data): 6         if new_data is None: 7             return 8         self.datas.append(new_data) 9     def output_html(self):10         fout = open('output1.html', 'w', encoding = 'utf-8')11         fout.write('')12         fout.write('')13         fout.write('')14         fout.write('')15         for data in self.datas:16             fout.write('')17             fout.write('' % data['url'])18             fout.write('' % data['title'])19             fout.write('' % data['summary'])20             fout.write('')21         fout.write('
%s%s%s
')22 fout.write('')23 fout.write('')24 fout.close()

登录后复制

  这里也有两个注意点

    1.fout = open(‘output1.html’, ‘w’, encoding = ‘utf-8’),这里的encoding参数一定要加,不然会报错,在windows平台,它默认是使用gbk编码来写文件的。

    2.fout.write(‘

‘),这里的meta标签也要加上,因为要告诉浏览器使用什么编码来渲染页面,这里我一开始没加弄了很久,我打开页面的内容,发现里面是中文的,结果浏览器展示的就是乱码。总的来说,因为整个页面采集过程结果好几个模块,所以编码问题要非常小心,不然少不留神就会出错。

 

  最后总结,这段程序还有许多方面可以深入探讨:

  1.页面的数据量过小,我尝试了10000个页面的爬取。一旦数据量剧增之后,就会带来一下问题,第一是待爬取url和已爬取url就不能放在set集合中了,要么放到radi缓存服务器里,要么放到mysql数据库中

  2.第二,数据也是同样的,字典也满足不了了,需要专门的数据库来存放

  3.第三量上去之后,对爬取效率就有要求了,那么多线程就要加进来

  4.第四,一旦布置好任务,单台服务器的压力会过大,而且一旦宕机,风险很大,所以分布式的高可用架构也要跟上来

  5.一方面是页面的内容过于简单,都是静态页面,不涉及登录,也不涉及ajax动态获取

  6.这只是数据采集,后续还有建模,分析…………

综上所述,路还远的很呢,加油!

 

  

以上就是爬虫问题解决的相关问题的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2269739.html

(0)
上一篇 2025年2月27日 11:22:01
下一篇 2025年2月19日 12:25:43

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在Python中用Request库模拟登录的实例教程

    如此简单(不安全)的登录表单已经不多见了。字幕库的登录表单如下所示,其中省去了无关紧要的内容: 1 2 3 4 5 6 登 陆7 登录后复制 通过抓包分析,可以发现用户名和密码都没有被加密: 直接使用POST来模拟登录: 1 import …

    2025年2月27日
    200
  • Python_安装官方whl包和tar.gz包

    windows环境:   安装whl包:pip install wheel    ->    pip install  **.whl   安装tar.gz包:cd到解压后路径,python setup.py install Linux…

    编程技术 2025年2月27日
    200
  • 分享python snownlp的实例教程

    snownlp是国人开发的python类库,可以方便的处理中文文本内容,是受到了textblob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和textblob不同的是,这里没有用nlt…

    2025年2月27日
    200
  • Python字符串的操作方法

    1. 字符串长度 #strlen(str)       # 字符串长度函数名str= ‘apples’              # 把字符串 “apples” 赋值给变量 strprint …

    编程技术 2025年2月27日
    200
  • Python是什么?Python如何使用?

    Python简介  python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  …

    2025年2月27日 编程技术
    200
  • 分享关于python中的题目实例

    题目一: 请使在3秒内计算出一组的数据,偶数在奇数前(注意不使用for while等循环的方法)格式如下1,2,3,4,5,6,7,8,9,10输出结果是2,1,4,3,6,5,8,7,10,9 解决思路:既然不能用for与while去写循…

    2025年2月27日
    200
  • python之调度器的用法

      继续上一篇文章的内容,上一篇文章中,将爬虫调度器已经写好了,调度器是整个爬虫程序的“大脑”,也可以称之为指挥中心。而现在,我们要做的就是去将调度器中用到的其他组件写好。首先是url管理器,它既然作为管理器,那么它一定要区分待爬取的url…

    编程技术 2025年2月27日
    200
  • Python中选择排序的实例详解

    选择排序:   选择排序(selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。…

    编程技术 2025年2月27日
    200
  • python学习—–类的封装、继承,多态

    封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。   1 class dog(object): …

    2025年2月27日 编程技术
    200
  • 浅谈Python中的排序

    浅谈排序 程序中经常用到排序函数,python 提供了 sort 和 sorted 函数,一个原地排序,一个返回排序后的新结果 1、参数 函数原型: sort([cmp[, key[, reverse]]]) 登录后复制 意思是sort方法…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论