您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > python爬虫实战
python爬虫实战,多线程爬取京东jdhtml页面:无需登录的网站的爬虫实战2014-12-0220:04:31标签:网站爬虫pythonimport版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。【前言】123456#本脚本用来爬取jd的页面:=737,794,870到#......=737,794,870&page=11&JL=6_0_0的所有html的内容和图片。#本脚本仅用于技术交流,请勿用于其他用途#byRiver#qq:179621252#Date:2014-12-0219:00:00【需求说明】以京东为示例,爬取页面的,获取页面中得数据:记录到data.txt;获取页面中得图片,保存下来。1、list的url如下2、商品详情页的url如下:【技术说明】12345678使用了python的以下库importos#检查文件是否存在等fromHTMLParserimportHTMLParser#用于解析html的库,有坑:如果2.6的python,可能悲剧importhttplib,re#发起http请求importsys,json,datetime,bisect#使用了二分快速查找fromurlparseimporturlparse#解析url,分析出url的各部分功能fromthreadingimportThread#使用多线程importsocket#设置httplib超时时间【代码逻辑说明】1、run(获取最终要的结果)2、parseListpageurl:返回list的总共的页面数量3、judgelist:判断该list是否已经爬取完毕了,第一个list中的所有url、最后list的所有url都爬取完毕了,那么久说明list的所有page爬取完毕了(实际上是一种弱校验)4、getfinalurl_content:如果list没爬取完毕,每个list爬取,解析list中得每个html(判断html是否爬取过),获得内容和img【坑说明】1、需要设置超时时间,和重试,否则爬取一个url卡住的时候,整个线程都悲剧了。2、有编码的坑,如果页面是gb2312的编码,需要转换为utf-8的编码:httprestmp.decode('gbk').encode('utf-8')3、parser.feed的内容,如果存在一些特殊字符,可能需要替换,否则解析出来会莫名不对4、图片保存,根据url获取前面两个数字,保存。以免一个目录下保存了过多的图片。【执行结果】1、console输出2、data.txt存储解析出来的内容3、judegurl.txt(保存已经爬取过的url)4、图片(下载的图片)【代码详情】123456789101112131415#-*-coding:utf-8-*-__author__='River'#本脚本用来爬取jd的页面:=737,794,870到#......=737,794,870&page=11&JL=6_0_0的所有html的内容和图片。#本脚本仅用于技术交流,请勿用于其他用途#byRiver#qq:179621252#Date:2014-12-0219:00:00importos#创建文件fromHTMLParserimportHTMLParser#用于解析html的库,有坑:如果2.616171819202122232425262728293031323334353637的python,可能悲剧importhttplib,re#发起http请求importsys,json,datetime,bisect#使用了二分快速查找fromurlparseimporturlparse#解析url,分析出url的各部分功能fromthreadingimportThread#使用多线程importsocket#设置httplib超时时间#定义一个ListPageParser,用于解析ListPage,如=737,794,870#htmlparser的使用简介#定义intt方法:需要使用到得属性#定义handle_starttag,处理你想分析的tag的具体操作#定义handle_data,遇到你定义的情况,获取相应标签的data#定义你获取最终返回的各种数据classListPageParser(HTMLParser):def__init__(self):self.handledtags=['a']self.processing=Noneself.flag=''self.link=''self.setlinks=set()##该list页面中包含的每个商品的url,定义为set,主要是为了使用其特性:去重self.pageNo=1self.alldata=[]self.lasturl=#指的最后一页的url如ahref==737%2C794%2C798&page=10&JL=6_0_010/aHTMLParser.__init__(self)defhandle_starttag(self,tag,attrs):pattern=re.compile(r'^[0-9]{2,}')pattern2=re.compile(r'^http:\/\/item.jd.com\/\d{1,10}.html$')#取出linkpattern3=re.compile(r'^http:\/\/list.jd.com\/list.html\?cat=\d{0,9}%2C\d{0,9}%2C\d{0,9}&page=*')#取出link38394041424344454647484950515253545556575859#attrs是属性的list,每个属性(包含key,value)又是一个元组#atarget=_blankhref==log("search","list",window.location.href,798,5,1258277,2,1,1,2,A)创维酷开(coocaa)K50J50英寸八核智能wifi网络安卓平板液晶电视(黑色)fontstyle=color:#ff0000;name=1258277class=adwords/font/a#已上为例子:判断了该list的长度为3(其他的a标签就被过滤了)iftaginself.handledtagsandlen(attrs)==3:#非常关键的是,找出你想的url和不想要的url的区别#printdebug:attrs,attrsself.flag=''self.data=''self.processing=tagfortarget,hrefinattrs:#非常关键的是,找出你想的url和不想要的url的区别ifpattern2.match(href):#再加一层判断,如果匹配上pattern2,说明是我们想要的urlself.setlinks.add(href)else:pass#怎样获取list中最后一页的url?分析吧:ahref==737%2C794%2C798&page=10&JL=6_0_010/a#1、长度为1#2,href是由规则的:cat=737%2C794%2C798&page=10&JL=6_0_0,所以,以下代码就出来了iftaginself.handledtagsandlen(attrs)==1:self.flag=''self.data=''self.processing=tagforhref,urlinattrs:#非常关键的是,找出你想的url和不想要的url的区别60616263646566676869707172737475767778798081#print'debug:attrs',attrsifpattern3.match(url):#print'debug:url',urlself.lasturl=urlelse:passdefhandle_data(self,data):ifself.processing:#去掉空格pass#其实这里我们根本没使用获取到得data,就pass把else:passdefhandle_endtag(self,tag):iftag==self.processing:self.processing=Nonedefgetlinks(self):returnself.setlinksdefgetlasturl(self):returnself.lasturl#定义一个FinallPageParser,用于解析最终的html页面,如的定义过程参考上个parser,关键是怎样分析页面,最终写出代码,并且验证,这里就不详细说了classFinallPageParser(HTMLParser):def__init__(self):self.handledtags=['div','h1','strong','a','del','div','img','li','span','tbody','tr','th','td','i']self.processing=Noneself.title=''self.jdprice=''self.refprice=''self.partimgs_show=set()#展示图片self.partimgs=set()#详情图片82838485868788899091929394959697989910010110self.partdetail={}#商品详情,参数等self.specification=[]#规格参数self.typeOrsize=set()#尺码和类型self.div=''self.flag={}self.flag['refprice']=''self.flag['title']=''self.flag['jdprice']=''self.flag['typeOrsize']=''self.flag['partimgs']=''self.flag['partdetail']=''self.flag['specification']=''self.flag['typeOrsize']=''self.link=''self.partslinks={}HTMLParser.__init__(self)defhandle_starttag(self,tag,attrs):self.titleflag=''self.flag['refprice']=''self.flag['title']=''self.flag['jdprice']=''self.flag['typeOrsize']=''self.flag['partimgs']=''self.flag['partdetail']=''self.flag['specification']=''self.flag['typeOrsize']=''iftaginself.handledtags:self.data=''self.processing=tagiftag=='div':forkey,valueinattrs:self.div=value#取出d
本文标题:python爬虫实战
链接地址:https://www.777doc.com/doc-4234352 .html