鱼C论坛

 找回密码
 立即注册
查看: 7293|回复: 11

求大神指教如何爬取shtml网页上面的内容

[复制链接]
发表于 2017-4-4 00:19:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图,网址已经被成功筛选出来了,但是后面就不知道怎么下载了,用的python2.7
PWA}1E[8}QNDZS$04_ZFAL6.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-4 00:21:29 | 显示全部楼层
救命啊,苦逼的做量化的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 07:13:25 | 显示全部楼层
把网址做个字符串变量再爬一遍不就完了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 09:23:47 | 显示全部楼层
你是下载图片吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 09:28:15 | 显示全部楼层
import string  
import urllib2  
import re  
  
#----------- 处理页面上的各种标签 -----------  
class HTML_Tool:  
    # 用非 贪婪模式 匹配 \t 或者 \n 或者 空格 或者 超链接 或者 图片  
    BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)")  
      
    # 用非 贪婪模式 匹配 任意<>标签  
    EndCharToNoneRex = re.compile("<.*?>")  
  
    # 用非 贪婪模式 匹配 任意<p>标签  
    BgnPartRex = re.compile("<p.*?>")  
    CharToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)")  
    CharToNextTabRex = re.compile("<td>")  
  
    # 将一些html的符号实体转变为原始符号  
    replaceTab = [("<","<"),(">",">"),("&","&"),("&","""),(" "," ")]  
      
    def Replace_Char(self,x):  
        x = self.BgnCharToNoneRex.sub("",x)  
        x = self.BgnPartRex.sub("\n    ",x)  
        x = self.CharToNewLineRex.sub("\n",x)  
        x = self.CharToNextTabRex.sub("\t",x)  
        x = self.EndCharToNoneRex.sub("",x)  
  
        for t in self.replaceTab:    
            x = x.replace(t[0],t[1])    
        return x    
      
class Baidu_Spider:  
    # 申明相关的属性  
    def __init__(self,url):    
        self.myUrl = url + '?see_lz=1'  
        self.datas = []  
        self.myTool = HTML_Tool()  
        print u'已经启动百度贴吧爬虫,咔嚓咔嚓'  
    
    # 初始化加载页面并将其转码储存  
    def baidu_tieba(self):  
        # 读取页面的原始信息并将其从gbk转码  
        myPage = urllib2.urlopen(self.myUrl).read().decode("gbk")  
        # 计算楼主发布内容一共有多少页  
        endPage = self.page_counter(myPage)  
        # 获取该帖的标题  
        title = self.find_title(myPage)  
        print u'文章名称:' + title  
        # 获取最终的数据  
        self.save_data(self.myUrl,title,endPage)  
  
    #用来计算一共有多少页  
    def page_counter(self,myPage):  
        # 匹配 "共有<span class="red">12</span>页" 来获取一共有多少页  
        myMatch = re.search(r'class="red">(\d+?)</span>', myPage, re.S)  
        if myMatch:    
            endPage = int(myMatch.group(1))  
            print u'爬虫报告:发现楼主共有%d页的原创内容' % endPage  
        else:  
            endPage = 0  
            print u'爬虫报告:无法计算楼主发布内容有多少页!'  
        return endPage  
  
    # 用来寻找该帖的标题  
    def find_title(self,myPage):  
        # 匹配 <h1 class="core_title_txt" title="">xxxxxxxxxx</h1> 找出标题  
        myMatch = re.search(r'<h1.*?>(.*?)</h1>', myPage, re.S)  
        title = u'暂无标题'  
        if myMatch:  
            title  = myMatch.group(1)  
        else:  
            print u'爬虫报告:无法加载文章标题!'  
        # 文件名不能包含以下字符: \ / : * ? " < > |  
        title = title.replace('\\','').replace('/','').replace(':','').replace('*','').replace('?','').replace('"','').replace('>','').replace('<','').replace('|','')  
        return title  
  
  
    # 用来存储楼主发布的内容  
    def save_data(self,url,title,endPage):  
        # 加载页面数据到数组中  
        self.get_data(url,endPage)  
        # 打开本地文件  
        f = open(title+'.txt','w+')  
        f.writelines(self.datas)  
        f.close()  
        print u'爬虫报告:文件已下载到本地并打包成txt文件'  
        print u'请按任意键退出...'  
        raw_input();  
  
    # 获取页面源码并将其存储到数组中  
    def get_data(self,url,endPage):  
        url = url + '&pn='  
        for i in range(1,endPage+1):  
            print u'爬虫报告:爬虫%d号正在加载中...' % i  
            myPage = urllib2.urlopen(url + str(i)).read()  
            # 将myPage中的html代码处理并存储到datas里面  
            self.deal_data(myPage.decode('gbk'))  
              
  
    # 将内容从页面代码中抠出来  
    def deal_data(self,myPage):  
        myItems = re.findall('id="post_content.*?>(.*?)</div>',myPage,re.S)  
        for item in myItems:  
            data = self.myTool.Replace_Char(item.replace("\n","").encode('gbk'))  
            self.datas.append(data+'\n')  
  
# 以某小说贴吧为例子  
# bdurl = 'http://tieba.baidu.com/p/2296712428?see_lz=1&pn=1'  
  
print u'请输入贴吧的地址最后的数字串:'  
bdurl = 'http://tieba.baidu.com/p/' + str(raw_input(u'http://tieba.baidu.com/p/'))   
  
#调用  
mySpider = Baidu_Spider(bdurl)  
mySpider.baidu_tieba()  

这个是找到帖子并把帖子转成txt格式放在桌面(这种问题,我建议你去百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-4 10:48:28 | 显示全部楼层
alltolove 发表于 2017-4-4 07:13
把网址做个字符串变量再爬一遍不就完了吗

问题是不行,这个网址是用urllib.request.urlopen()打不开的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-4 11:06:33 | 显示全部楼层

不是图片,是一种特殊的网页,我要拿到他的html,你可以试试看怎么得到下面网址的html部分
http://news.10jqka.com.cn/field/sn/20170302/9618521.shtml
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-4 11:06:55 | 显示全部楼层

不是图片,是一种特殊的网页,我要拿到他的html,你可以试试看怎么得到下面网址的html部分
http://news.10jqka.com.cn/field/sn/20170302/9618521.shtml
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-4 11:07:24 | 显示全部楼层
@小甲鱼  救命啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 11:33:53 | 显示全部楼层
那就正则表达式呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-4 11:41:25 | 显示全部楼层
新手·ing 发表于 2017-4-4 11:33
那就正则表达式呗

关键是连解析都解析不了,怎么使用正则表达式,要不版主您试一试,感激不尽,网址在楼上贴出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 11:47:29 | 显示全部楼层
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xadV\xcbo\x1bE\x18\xbf\xfb\xaf\x98nU\xa5-\xd9\x1d\xaf\xed\xd8\xf1S\xca\xabPQh\x05\xe9\x83S4\xde\x99]O2\xbb\xb3\xd9\x19\xbf\x1a\xe5\x9f\xe1\x04*\x08\x15ZBT\x91r\xa8P\x9b\xd2R\x89VB\x15\x17. np\xe3T\xf1\xcd\xae\xed8\xd4\x15PaY\xde\xf1\xec\xf7\xfe\xfd\xbeo\xa6qb\xf5\xe2\xca\xfa\x07\x97\xd6PG\x87\x02]\xba\xbc|\xe1\xfc\n\xb2l\x8c\xaf\x16W0^]_E\xd7\xdeZ\x7f\xe7\x02r\x9d<ZOH\xa4\xb8\xe62"\x02\xe3\xb5w-du\xb4\x8ek\x18\xf7\xfb}\xa7_td\x12\xe0\xf5\xf7\xf0\xc0\xd8r\x8d\xf2hi\xeb)M\x87jj\xb5r\x8d\xd4\xe1 \x14\x91j\xce0\xe3V\xab\xd5L;\x95e\x84\xc2#d\x9a #k\xb3\xed.\xef5\xadk\xf6\xe5%{E\x861\xd1\xbc-\x98\x85<\x19i\x16\xe9\xa6u~\xad\xc9h\xc0\xe6\xbdN"C\xd6t\xadY\xea+\x99\xb4\xbd>\x8c\xa7u5\x1bhl\\\xd7\x91\xd7!\x89b\xba\xf9\xe6\xf2\xdb\x16\xc2`C\xf0h\x0bu\x12\xe6O\x82\xe6\x8e\xee(\xeex\x11\x16$\xa2!\x8f\x18\xa62t\ny\xd7\xcd/\xba\x15\xc7S\xcaB\t\x13MK\xe9\xa1`\xaa\xc3\x98\xb6\x90\x06\x97#O\xa9\xc0\xbf\xb6}\xd5N\xcd`O\n\x99\xbc\x8e\x17\xcd\xb5`\xado\xee\xef\xdd\xd9\xfb\xf0\xd9\xfe\xfe\x8f?<\xdf\xbf\xf1\xf0`\xff\xc1\xb77\xef>\xb8\xf7\xd3\xcd;\x87\xb7\x0f?~\xf4\xf0\xf0\xc9\xde\xaf\xdf?;\xf8\xec\xf0\xe0\xf6\xbd\xdb\xcf\xbf|q\xeb\xf1w?\x1f\x1e<y\xba\x7f\xe3\xab_l\xfb\xd1\'w>z\xf8\xc5\xd7\xbf\xdf\x7f\xbe\xf7\xe2\xf1\x1f\x8f\xfel\xe0\xccj\xae\x81GP\xa5Q\xfc\xdd\x7f+g\xaa\xba\x83:\x8c\x07\x1d]s\xf3\xf9Su\xd4\xe7TwFk\xd9c\x89/d\xbf\xd6\xe1\x94\xb2\xa8\x8evsmI\x87\x13\r\xf4\xb2JH\x92\x80G5\x94\xaf\xa3\x98P\xca\xa3 ]\xef\xe6\xf0Y\x14J\xca\xfd!\x82"-\xb8\xae[Fgq\xce\xb9"5[\x96\x83\x9d\xcc\x06*\x15K\xf1\x00\x9d\xe0a,\x13M"]7\xc1\xdaD\xf0\x00l\n\xe6\xeb\xfan\xce\xe9\xb5\xbbZ\xcbh\x07\x00b\xf68\x94b5\x1eL\xe9\xf9\xc0\x1e[\xf1\xeb\x0c\x82\\\x8c\x07F\xcd\x17Du\xae&$FNL}\x83\xeeN,\xb36\xa8!\xd2VRt5\x9bRt\x0b\xa0\xa7e\\CeX\x18\xe75T1{\xa3X\x17+\xb0\x1e\xbb/\x94\x8c\xcct@\xe9NJ\x8b\x1a:\xe9\xfb>\xf3\xd9+\xf2\xf2\x80\xe6,\xa9\xb7\x89\xb7\x15$\xb2\x1b\xd1\x1a\xea&\xe2\xf4\x88tjB:\xc0\x0c{\x82\x834\x8e\xa4\xe6\x1e\xc3<$\x01Sx\x94\x8e\xb3\x19\x07gP$\xed\x84\xc5\x8c\x98R5p\n|+\x97k\x18\xe0\xe0\x99kP\xdeC\x9c6\xadI9\xa0\xd5`\xa9\xa6wZ9\xd4 H\x03\x96\xd0l\xd6F\x1b\xe8\xbee\x1d\xef\x05\xa5\xa1\xc9=G)\xe6x\xd0_\x10\x1e\xe5\xca\x13Ru\x13\x86\x05W\x9a\x01\xf8\xbe\xc4$\x8a %\x8f\x85&l\x0f\x03\xf8\x15;_\xb4\xf3\x05\\\xce\xe7\xddRu\xc3\xec\xe4\x8b\xf9\xc2\x86k`\x99\x043\xca\xc9j}\xfe\xdb\xdd[\x97V\xcf=\xfd\xf4\xf1\xbd\x06&\xc0e\xd9\xded\x9e\xce\xe4L"\x9e\x80Gm\xb5PYY].\xaf\xd9Kk\xe5U\xdbu=\xdf\xae\x96\x97\x17\xedR\xa9\xb4\xb0P\\(\xe5\xe1c\xa5\x89\x83\xb1+\x9c\xf5Ybe\xccmZ\x15\xb7j\x8d8\xdd\xb4\x16\n \x87`\xfcP\xd6&\x8aM\x12\xf6c*\xfb\x91\x90\x84:!\xf1\xcc\x18\xa3\x9c\x98\xdc1\x14\t\xa7\xb5\x8b\x05\x19\xb2\x04{\xdd$1\xd9\xaa~\xba\xebx\xa4m\xb5P\x0e\xa1FL\x12\x12\xa2\x88\xc0\x08\xb4B\xd9\xe30\xe6zDt\x8f\x9cd\xb8:n~s{\x8b\x8c\x0b\x0bv\xa0\xdc\xd2\xdb2@\xf7\xd2\xd0\x1d\xd83\xf3\xe3%\xab\xdb] \x95\x1e\x1e\xd9\x85\xa4f\n\xb6\x83\x94\x9b\x13\xc1\x93\x8b\x15R\xa5\xe5\x99\xb2}\xe8\xdc\xa3P\xd3\xd3\x03^C\x8a\xd6?\xc9^\x8c\xc9v\x97\xcd\x10#\x02\xe6\xca\xfb^\xc2c\xbd\xe4y\xccL\xc3\x91\n\x11}2T3\xe3H\x95\xceu\x85\x00E\xc6\xa2\xa9\x88\xc0\xc7,\x85\xb4\xfe=83\xc6\xa2sP7\x9f\x0b\xd64\xf5>U\\:U8\x07\xdfYU\x87m\x12s\xf8\x05\r\xf8uK\xd4c\x04\xb8\xe1\x97+\x95\x85v\xdb\x0007v\xc9\xc26\xa3GMe!\x95x\xaf\t\xe9\x08\xbf1p#\x94\x8e\xe0\x01w\xaf$m\x96\xf3\x14\xbd\xd3\xf9\x02L\x83\xe9\r\xa71\xa8\x1a\x82\x8e\xca\x05\xff\x84\x941\x84L\x84J\xff\x1ewm\x1c\x19(\x8f\xe3\r\xbb/!7\x81l\xfc\xf2\x08\xa114\xf0f\x02\xc5\xff\x8d\x01\xd8\xce\xce5\x12\xc7\x82{\xc4\xccs<\xb0U\x07\xaa\xdb\'=fg\x98\xa4\xd9w\xe1l\x82T\x02v\xec\x8eC\xa8l\xb3\xac\x93\xa5i\xe6\xa9^\x1e1\x17\xa7\x08\xc3\xba\x81\xb3\xe9c\x8eV\x18\xa4\xe9@Ui-\x8ea~4\xb37\x15\x8eX_\xe1 \xc8F\x04\xa1$\xd6\x0e\\\x1d\xcc]\xa1\xe8l\xaac\xb7\x82M\xd2#\x999\xab\x05\xb3;]\xb5\xfe\xd9\x83&c\x8bn\xbeZX\xfcOV[9\x00\x05\xb8\x8b\x9a\xc8\xba>\xd8P\x91U__r\x84\x0cN\xef\xc0TEs\xdeF\xb5\xec..\x14\xdc\xb9y\xe4\x9b\x1dN\xdf\x98\x9b\x07I\x12\x04\x81yz\x1b\xaa\x1b\xceou\xe8\xc6u:\xa4s\xbbg\xea\xb9)\'8;w\x1a\xe9\x05\xae\x95\xfb\x0b\xe2,\x95\xf2\xe1\n\x00\x00'
fuck,我这有点问题,你试试代码
import urllib.request

bai_du = urllib.request.urlopen('https://segmentfault.com/a/1190000005840672')
html = bai_du.read()
html = html.decode('utf-8')

print(html)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表