有经验的郑州网站建设,石家庄做外贸网站建设,电商网站价格监控,wordpress拼团之前看了一段有关爬虫的网课深有启发#xff0c;于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来#xff0c;方便后期其他人一起来学习。
抓取策略
确定目标#xff1a;重要的是先确定需要抓取的网站具体的那些部分#xff0c;下面实例是…之前看了一段有关爬虫的网课深有启发于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来方便后期其他人一起来学习。
抓取策略
确定目标重要的是先确定需要抓取的网站具体的那些部分下面实例是咦抓取百科python词条页面以及python有关页面的简介和标题。
分析目标分析要抓取的url的格式限定抓取范围。分析要抓取的数据的格式本实例中就要分析标题和简介这两个数据所在的标签的格式。分析要抓取的页面编码的格式在网页解析器部分要指定网页编码然后才能进行正确的解析。
编写代码在网页解析器部分要使用到分析目标得到的结果。
执行爬虫进行数据抓取。 分析目标
1、url格式
进入百科python词条页面页面中相关词条的链接比较统一大都是/view/xxx.htm。
2、数据格式
标题位于类lemmaWgt-lemmaTitle-title下的h1子标签简介位于类lemma-summary下。
3、编码格式
查看页面编码格式为utf-8。
经过以上分析得到结果如下
代码编写
项目结构 在sublime下新建文件夹baike-spider作为项目根目录。 新建spider_main.py作为爬虫总调度程序。 新建url_manger.py作为url管理器。 新建html_downloader.py作为html下载器。 新建html_parser.py作为html解析器。 新建html_outputer.py作为写出数据的工具。
具体代码示例
spider_main.py
# coding:utf-8
import url_manager, html_downloader, html_parser, html_outputerclass SpiderMain(object):def __init__(self):self.urls url_manager.UrlManager()self.downloader html_downloader.HtmlDownloader()self.parser html_parser.HtmlParser()self.outputer html_outputer.HtmlOutputer()def craw(self, root_url):count 1self.urls.add_new_url(root_url)while self.urls.has_new_url():try:new_url self.urls.get_new_url()print(craw %d : %s % (count, new_url))html_cont self.downloader.download(new_url)new_urls, new_data self.parser.parse(new_url, html_cont)self.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)if count 10:breakcount count 1except:print(craw failed)self.outputer.output_html()if __name____main__:root_url http://baike.baidu.com/view/21087.htmobj_spider SpiderMain()obj_spider.craw(root_url)url_manger.py
# coding:utf-8
class UrlManager(object):def __init__(self):self.new_urls set()self.old_urls set()def add_new_url(self, url):if url is None:returnif url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) 0:returnfor url in urls:self.add_new_url(url)def has_new_url(self):return len(self.new_urls) ! 0def get_new_url(self):new_url self.new_urls.pop()self.old_urls.add(new_url)return new_urlhtml_downloader.py
# coding:utf-8
import urllib.requestclass HtmlDownloader(object):def download(self, url):if url is None:return Noneresponse urllib.request.urlopen(url)if response.getcode() ! 200:return Nonereturn response.read()html_parser.py
# coding:utf-8
from bs4 import BeautifulSoup
import re
from urllib.parse import urljoinclass HtmlParser(object):def _get_new_urls(self, page_url, soup):new_urls set()# /view/123.htmlinks soup.find_all(a, hrefre.compile(r/view/\d\.htm))for link in links:new_url link[href]new_full_url urljoin(page_url, new_url)# print(new_full_url)new_urls.add(new_full_url)#print(new_urls)return new_urlsdef _get_new_data(self, page_url, soup):res_data {}# urlres_data[url] page_url# dd classlemmaWgt-lemmaTitle-title h1Python/h1title_node soup.find(dd, class_lemmaWgt-lemmaTitle-title).find(h1)res_data[title] title_node.get_text()# div classlemma-summary label-modulelemmaSummarysummary_node soup.find(div, class_lemma-summary)res_data[summary] summary_node.get_text()# print(res_data)return res_datadef parse(self, page_url, html_cont):if page_url is None or html_cont is None:returnsoup BeautifulSoup(html_cont, html.parser)# print(soup.prettify())new_urls self._get_new_urls(page_url, soup)new_data self._get_new_data(page_url, soup)# print(mark)return new_urls, new_datahtml_outputer.py
# coding:utf-8
class HtmlOutputer(object):def __init__(self):self.datas []def collect_data(self, data):if data is None:returnself.datas.append(data)def output_html(self):fout open(output.html,w, encodingutf-8)fout.write(html)fout.write(body)fout.write(table)for data in self.datas:fout.write(tr)fout.write(td%s/td % data[url])fout.write(td%s/td % data[title])fout.write(td%s/td % data[summary])fout.write(/tr)fout.write(/table)fout.write(/body)fout.write(/html)fout.close()运行
在命令行下执行python spider_main.py。
编码问题
问题描述UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position …
使用Python写文件的时候或者将网络数据流写入到本地文件的时候大部分情况下会遇到这个问题。网络上有很多类似的文章讲述如何解决这个问题但是无非就是encodedecode相关的这是导致该问题出现的真正原因吗不是的。很多时候我们使用了decode和encode试遍了各种编码utf8utf-8gbkgb2312等等该有的编码都试遍了可是仍然出现该错误令人崩溃。
在windows下面编写python脚本编码问题很严重。将网络数据流写入文件时我们会遇到几个编码
1、#encoding’XXX’
这里(也就是python文件第一行的内容)的编码是指该python脚本文件本身的编码无关紧要。只要XXX和文件本身的编码相同就行了。
比如notepad”格式”菜单里面里可以设置各种编码这时需要保证该菜单里设置的编码和encoding XXX相同就行了不同的话会报错。
2、网络数据流的编码
比如获取网页那么网络数据流的编码就是网页的编码。需要使用decode解码成unicode编码。
3、目标文件的编码
将网络数据流写入到新文件写文件代码如下
fout open(output.html,w)
fout.write(str)在windows下面新文件的默认编码是gbkpython解释器会用gbk编码去解析我们的网络数据流str然而str是decode过的unicode编码这样的话就会导致解析不了出现上述问题。 解决的办法是改变目标文件的编码
fout open(output.html,w, encodingutf-8)