范传辉《Python爬虫开发与项目实战》基础爬虫的Python 3版本学习调试
一、 简单爬虫架构
1、爬虫调度器:(SpiderMan.py)用来启动、执行、停止爬虫,统筹协调其他四个模块;
2、URL管理器:(UrlManager.py)负责管理URL链接,维护已爬的URL集合和未爬的URL集合,并提供新的URL链接接口;
3、URL下载器:(HtmlDownloader.py)从未爬的URL集合获取链接,下载HTML网页;
4、HTML解析器:(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。
三、 简单爬虫版本3的HtmlParser.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