Python 3学习笔记(5):Python3基础爬虫的调试

范传辉《Python爬虫开发与项目实战》基础爬虫的Python 3版本学习调试

一、    简单爬虫架构

1、爬虫调度器:(SpiderMan.py)用来启动、执行、停止爬虫,统筹协调其他四个模块;

2URL管理器:(UrlManager.py)负责管理URL链接,维护已爬的URL集合和未爬的URL集合,并提供新的URL链接接口;

3URL下载器:(HtmlDownloader.py)从未爬的URL集合获取链接,下载HTML网页;

4HTML解析器:(HtmlParser.py)解析新的URL链接给URL管理器,解析有效数据给数据存储器;

5、数据存储器:(DataOutput.py)保存有效数据。

二、    简单爬虫版本3的调试

1、 HtmlParser.py

soup= BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8')

报错:UserWarning: Youprovided Unicode markup but also provided a value for from_encoding. Yourfrom_encoding will be ignored.        

解决方法: soup =BeautifulSoup(html_doc,"html.parser")           

            这一句中删除【from_encoding="utf-8"      

原因:python3 缺省的编码是unicode, 再在from_encoding设置为utf8, 会被忽视掉,去掉【from_encoding="utf-8"】这一个好了       

2、 HtmlParser.py

  报错:拼接完整网址new_full_url = urlparse.urljoin(page_url,new_url)

 这句出错,直接跳出。

  原因:python3升级,urljoin现在对应的函数是urllib.parse.urljoin

解决方法:改为

 from  urllib.parse import urljoin

new_full_url = urljoin(page_url,new_url)

3、 格式问题

报错:TabError:inconsistent use of tabs and spaces in indentation

原因:格式问题,应该用空格,不能用Tab对齐。

解决方法:用四个空格替换Tab

三、   简单爬虫版本3HtmlParser.py修改
#coding:utf-8
import re
import urllib
from bs4 import BeautifulSoup
from urllib.parse import urljoin


class HtmlParser(object):

    def parser(self,page_url,html_cont):

        # 用于解析网页内容抽取URL和数据
        # :param page_url: 下载页面的URL
        # :param html_cont: 下载的网页内容
        # :return:返回URL和数据
		# 报错:		
		# UserWarning: You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.		
		# 解决方法:
		# soup = BeautifulSoup(html_doc,"html.parser")		
		# 这一句中删除【from_encoding="utf-8"】		
		# 原因:		
		# python3 缺省的编码是unicode, 再在from_encoding设置为utf8, 会被忽视掉,去掉【from_encoding="utf-8"】这一个好了        
        if page_url is None or html_cont is None:
            return
        soup = BeautifulSoup(html_cont,'lxml')
        new_urls = self._get_new_urls(page_url,soup)
        new_data = self._get_new_data(page_url,soup)
        return new_urls,new_data


    def _get_new_urls(self,page_url,soup):
        # '''
        # 抽取新的URL集合
        # :param page_url: 下载页面的URL
        # :param soup:soup
        # :return: 返回新的URL集合
        # '''
        nameRegex=re.compile(r"/item/.*")
        new_urls = set()
        #抽取符合要求的a标签
        #原书代码
        # links = soup.find_all('a',href=re.compile(r'/view/\d+\.htm'))
        #2017-07-03 更新,原因百度词条的链接形式发生改变
        links = soup.find_all('a', href=re.compile(r'/item/.*'))   
        #print(a_list)
        for link in links:
            #提取href属性
            new_url = link['href']                     
            print('new_url=',new_url)
            print('page_url=',page_url)
            #拼接成完整网址,urljoin现在对应的函数是urllib.parse.urljoin
            try:
                new_full_url = urljoin(page_url,new_url)  
                print(new_full_url)
                new_urls.add(new_full_url)	
            except:
            	print('It is wrong!')    								
        return new_urls  
            
    def _get_new_data(self,page_url,soup):
        # '''
        # 抽取有效数据
        # :param page_url:下载页面的URL
        # :param soup:
        # :return:返回有效数据
        # '''
        data={}
        data['url']=page_url
        title = soup.find('dd',class_='lemmaWgt-lemmaTitle-title').find('h1')
        data['title']=title.get_text()
        summary = soup.find('div',class_='lemma-summary')
        #获取到tag中包含的所有文版内容包括子孙tag中的内容,并将结果作为Unicode字符串返回
        data['summary']=summary.get_text()
        return data

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值