精华内容
下载资源
问答
  • 爬虫实战-爬取网站评论和链接

    千次阅读 2019-08-25 16:22:15
    爬取网站评论数据和每条评论对应的链接,然后存在本地
    案例代码:
    import requests
    from lxml import etree
    import json
    
    
    class BtcSpider(object):
        def __init__(self):
            self.base_url = 'https://www.chainnode.com/forum/61-'
            self.headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
            }
            self.data_list = []
        # 1.发送请求
        def get_response(self, url):
            response = requests.get(url,headers=self.headers)
            # 需要看一下抓取网页的编码格式  解码的时候需要使用对应的编码格式
            data = response.content.decode('utf-8')
            return data
    
        # 2.解析数据
        def pase_data(self, data):
            # 使用xpath解析当前页面所有的title和url保存
            # 2.1 转类型
            x_data = etree.HTML(data)
            # 2.2 根据xpath路径开始解析  跨节点取所有a标签
            # link-dark-major font-bold bbt-block
            # link-dark-major font-bold bbt-block
            title_list = x_data.xpath('//a[@class="link-dark-major font-bold bbt-block"]/text()')
            # print(title_list)
            # 取a标签 里面的  url
            url_list = x_data.xpath('//a[@class="link-dark-major font-bold bbt-block"]/@href')
            # 添加域名
            n = len(url_list)
            for i in range(0, n):
                url_list[i] = "https://www.chainnode.com" + url_list[i]
            # print(url_list)
    
            # 组合  一条评论对应一个链接
            # 枚举遍历
            for index, title in enumerate(title_list):
                comment = {}
                comment['name'] = title
                comment['url'] = url_list[index]
                self.data_list.append(comment)
    
            # print(self.data_list)
            print(len(self.data_list))
    
        # 3.保存数据
        def save_data(self):
            # 将解析之后的list 列表数据转换为json串
            data_str = json.dumps(self.data_list, ensure_ascii=False)
            with open('02_bic.json', 'w', encoding='utf-8') as f:
                f.write(data_str)
        # 4.启动
        def run(self):
            for i in range(1, 5):
                # 4.1 拼接完整的url
                url = self.base_url + str(i) + ".html"
                print(url)
                # 4.2 发送请求
                data = self.get_response(url)
                # 4.3 做解析
                self.pase_data(data)
            # 4.4 做保存
            self.save_data()
    
    
    BtcSpider().run()
    
    模糊搜索和取兄弟节点
    # 模糊搜索
    result_list = html_data.xpath('//div[contains(@data-articleid, "100")]')
    # 下一个同级节点   用在取兄弟标签
    result_list = html_data.xpath('//head/following-sibling::*[1]')
    
    展开全文
  • livefyre评论获取

    2015-04-03 09:58:00
    前几次面见教授的时候就和教授说,“我发现好多新闻网站评论都是使用livefyre,但是它有一段代码被加密了,我没有办法取得其中的评论。” 教授倒是很好说话的,只让我把他们列出来,然后放在一边就好了。翻译过来...

    前情提要:

    前几次面见教授的时候就和教授说,“我发现好多新闻网站的评论都是使用livefyre,但是它有一段代码被加密了,我没有办法取得其中的评论。”

    教授倒是很好说话的,只让我把他们列出来,然后放在一边就好了。翻译过来的意思就是“没有关系,你把他们找出来列成一个表,以后还有学生想做这个课题我就丢给他做。”

    之后我又发现Wall Street Journal的新闻评论可以通过增加“/tag/comments”就可以得到,特别开心。谁知道今天在做开发的时候才发现,根本不是那么一回事啊。。。

    之前从首页链进去的网站实际上是"Blog WSJ"这还有区别!!!!而从google news进去的新闻的评论一样是livefyre...

    于是开始认真的研究在监控中可以看到的respond json page里面那一长串的东西究竟是什么。

    Example:

    原页面是:http://www.wsj.com/articles/how-300-emails-led-to-a-summer-job-on-wall-street-1427932335

    点击页面中的评论之后,给出的返回XHR是: http://bootstrap.wsj.fyre.co/bs3/v3.1/wsj.fyre.co/357384/U0IxMjQ5ODg4NTAwMzMwMjg3NDM0MjQwNDU4MDU1NDI4MDEzODM1MDYxOA==/init

    关于我说的不知道是什么的就是U0IxMjQ5ODg4NTAwMzMwMjg3NDM0MjQwNDU4MDU1NDI4MDEzODM1MDYxOA ☜这个东西

    其实之前也查过,到处找也不能找到它到底来自哪里。


    今天去拜读了一下Livefyre的官方说明。以后查资料真的要查英文不能查中文。。。


    其中有一段是这样的

    =====================================分割线=========================================================================================

    Init

    The init call is used to gather initial Collection metadata and to discover where Collection content can be requested from. The init call will return an error if the collection was not already created via the create endpoint.

    GET http://bootstrap.{network}/bs3/{network}/{site_id}/{b64url_articleId}/init
    Path parameters
    • network (String, required) - Your Livefyre Network
    • site_id (Int, required) - The Site ID of the Site you want to create a collection in
    • b64url_articleId (String, required) - Generated by applying the base64url algorithm to the Article ID of the desired Collection.

    =====================================分割线=========================================================================================


    大致是告诉你在返回的网页地址中有大括号的分别是什么,其他对着填就行了。仔细一看 b64url_articledId 就是我正要找的那串不知名的东西!

    至于什么事base64url我之前也不知道,现google,ok是一种加密方法。

    把之前那串东西复制下来,在网上找一个解密的网页,拿解密之后的一串字符和原网页的article id一对比,一模一样~



    结了~~


    这个方法可以套在好多新闻网站上~又可以愉快的报告了~


    贴下Encode的代码:

    	String base64UrlDecode(String input) {
    	    String result = null;
    	    Base64 decoder = new Base64(true);
    	  
    	    String encoded = decoder.encodeToString(input.getBytes());
    	    
    	    result = new String(encoded);
    	    return result;
    	}


    展开全文
  • 旅游网-去哪儿网景点评论爬取

    千次阅读 多人点赞 2018-11-24 00:13:18
    pageSize就是一次请求回复多少评论,通过查看文件,可以知道最大设为50,page为页数,当超过页数时,则没有信息,代码如下: from bs4 import BeautifulSoup import pandas as pd import json import requests import time ...

    前言

     最近由于学校的项目需要用到旅游相关的数据集,而与这方面相关的又必要少,于是就想到通过python爬虫自己去爬取。
     由于我也是初次接触爬虫,很多知识点还不会,方式可能有点粗暴,但终归还是爬取了,可能就是慢了点,和自己要时刻手操下(づ ̄ 3 ̄)づ
    长话短说,现在开始吧<( ̄︶ ̄)↗[GO!]

    正文

    第一步
    首先要获取城市的id,这个需要从(http://travel.qunar.com/place/)获取
    在这里插入图片描述
    这个页面可以就直接右键查看代码,然而根据相应信息进行提取,这里我保存为city.csv文件,代码如下:

    from bs4 import BeautifulSoup
    import pandas as pd
    import requests
    
    def get_static_url_content(url):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        req=requests.get(url,headers=headers)
        content=req.text
        bsObj=BeautifulSoup(content,'lxml')
        return bsObj
    
    def get_city_id():
        url = 'http://travel.qunar.com/place/'
        bsObj=get_static_url_content(url)
        cat_url = []
        cat_name = []
        bs=bsObj.find_all('div',attrs={'class':'sub_list'})
    
        for i in range(0,len(bs)):
            xxx = bs[i].find_all('a')
            for j in range(0,len(xxx)):
                cat_name.append(xxx[j].text)
                cat_url.append(xxx[j].attrs['href'])
        return cat_name,cat_url
    
    city_name_list,city_url_list=get_city_id()
    city=pd.DataFrame({'city_name':city_name_list,'city_code':city_url_list})
    city.to_csv('city.csv',encoding='utf_8_sig')
    

    运行完,你将得到csv文件,打开得到
    在这里插入图片描述
    到这里已经获取某个城市id,将为第二步做准备

    第二步
    爬取具体某个城市景点id,这里以杭州举例http://travel.qunar.com/p-cs300195-hangzhou
    在这里插入图片描述
    爬取http://travel.qunar.com/p-cs300195-hangzhou-jingdian中的景点id,代码如下:

    from bs4 import BeautifulSoup
    import pandas as pd
    import requests
    
    def get_static_url_content(url):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        req=requests.get(url,headers=headers)
        content=req.text
        bsObj=BeautifulSoup(content,'lxml')
        return bsObj
    
    def get_jd_url(url):
        #该城市最大景点数
        maxnum = get_static_url_content(url+'-jingdian').find('p',{'class':'nav_result'}).find('span').text
        #提取数字
        maxnum=int(''.join([x for x in maxnum if x.isdigit()]))
    
        url=url+'-jingdian-1-'
        cat_url = []
        cat_name = []
    
        # 这里取top100景点 每页10条 page从1开始
        page=11
        # 判断是否超过范围
        if (page-1)*10>maxnum :
            page=int(((maxnum+10)/10)+1)
    
        for i in range(1,page):
            url1=url+str(i)
            bsObj=get_static_url_content(url1)
            bs=bsObj.find_all('a',attrs={'data-beacon':'poi','target':'_blank'})
            for j in range(0, len(bs)):
                if(bs[j].text!=''):
                    cat_name.append(bs[j].text)
                    cat_url.append(bs[j].attrs['href'])
        print(cat_name,cat_url)
        print(len(cat_name))
        print(len(cat_url))
        return cat_name, cat_url
    
    #杭州举例
    url='http://travel.qunar.com/p-cs300195-hangzhou'
    city_name_list,city_url_list=get_jd_url(url)
    city=pd.DataFrame({'city_name':city_name_list,'city_code':city_url_list})
    city.to_csv('hangzhou-jd-top100.csv',encoding='utf_8_sig')
    
    

    结果是
    在这里插入图片描述

    第三步
    这里将以西湖http://travel.qunar.com/p-oi708952-xihu为例,爬取评论数据
    注意,这里的评论都是动态加载的(注意到不管点第几页浏览器的地址栏都是不变的),我们随意点一页看一下,比如第二页:
    在这里插入图片描述
    所以通过chrome F12检测数据传输,发现每次点击下一页,都会发生回复json请求,在Network-XHR出现新的请求,双击打开可以发现我们要的数据
    例如http://travel.qunar.com/place/api/html/comments/poi/708952?poiList=true&sortField=1&rank=0&pageSize=10&page=2
    在这里插入图片描述
    我们能很容易从这里找到规律,poi后的数字就是景点id,pageSize就是一次请求回复多少评论,通过查看文件,可以知道最大设为50,page为页数,当超过页数时,则没有信息,代码如下:

    from bs4 import BeautifulSoup
    import pandas as pd
    import json
    import requests
    import time
    
    def get_static_url_content(url):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        req = requests.get(url, headers=headers)
        content = req.text
        bsObj = BeautifulSoup(content, 'lxml')
        return bsObj
    
    def get_jd_comment(url):
        # 该景点最大评论数
        maxnum = get_static_url_content(url).find('span', {'class': 'e_nav_comet_num'}).text
        maxnum = int(maxnum)
    
        poi = ''.join([x for x in url if x.isdigit()])
    
        cat_user_id = []
        cat_user_name= []
        cat_jd_poi = []
        cat_score = []
        cat_user_comment = []
        cat_comment_time = []
    
        url = 'http://travel.qunar.com/place/api/html/comments/poi/' + poi + '?poiList=true&sortField=1&rank=0&pageSize=50&page='
        #这里页数暂时设为101,取的pageSize=50,即爬取100*50条评论
        page = 101
        if (page - 1) * 50 > maxnum:
            page = int(((maxnum + 50) / 50)+1)
        for i in range(1, page):
            url1 = url + str(i)
            json_str = requests.get(url1, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}).text
            json_data=json.loads(json_str)['data']
            #print(json_data)
            bsObj = BeautifulSoup(json_data, 'lxml')
            bs=bsObj.find_all('li',{'class':'e_comment_item clrfix'})
    
            for j in range(0,len(bs)):
                try:
                    user=bs[j].find('div', {'class': 'e_comment_usr_name'}).find('a')
                    cat_user_id.append(''.join([x for x in user.attrs['href'] if x.isdigit()]))
    
                    cat_user_name.append(user.text)
    
                    cat_jd_poi.append(poi)
    
                    score=''.join([x for x in str(bs[j].find('span',{'class':'total_star'}).find('span')) if x.isdigit()])
                    cat_score.append(score)
    
                    a=bs[j].find('div',{'class':'e_comment_content'}).find_all('p')
                    cat_user_comment.append(''.join(x.text for x in a))
    
                    cat_comment_time.append(bs[j].find('div',{'class':'e_comment_add_info'}).find('li').text)
    
                except:
                    print('i=',i,'j=',j,'有问题')
            print('已完成poi=',poi,' ',i,'/',page-1)
            time.sleep(0.2)
    
        return cat_user_id,cat_user_name,cat_jd_poi,cat_score,cat_comment_time,cat_user_comment
    
    # 西湖举例
    url = 'http://travel.qunar.com/p-oi708952-xihu'
    cat_user_id,cat_user_name,cat_jd_poi,cat_score,cat_comment_time,cat_user_comment=get_jd_comment(url)
    city=pd.DataFrame({'user_id':cat_user_id,'user_name':cat_user_name,'jd_poi':cat_jd_poi,'score':cat_score,'time':cat_comment_time,'comment':cat_user_comment})
    city.to_csv('xihu-jd-comment.csv',encoding='utf_8_sig')
    

    爬取结果为:
    在这里插入图片描述
     第三步爬取时,有时会因为ip大量访问而被暂时禁止,需要登陆该正在被爬取景点地址,输入验证码才解禁,如果通过动态代理,可能可以避免此现象。

    展开全文
  • “老师说会给我们时间继续完善这个作业,直到可以真的爬到微信朋友圈内容….”,其实之后前面半句是有,但是后面半句真的爬到朋友圈却没有了,老师改变了需求,我们变成了去爬一些旅游网站了。我们被分派到的任务是...

    前言

    最近考试一直都没有时间写这篇总结,现在考试暂告一段落,现在抽空出来写一篇总结,总结一下python爬虫的学习进度。

    承接上一篇基于scrapy框架爬虫学习小结,上一篇主要是第二次作业后,“老师说会给我们时间继续完善这个作业,直到可以真的爬到微信朋友圈内容….”,其实之后前面半句是有,但是后面半句真的爬到朋友圈却没有了,老师改变了需求,我们变成了去爬一些旅游网站了。

    我们被分派到的任务是:研究分析携程,艺龙,去哪儿,途牛和驴友的爬去规则分析以及爬取他们的酒店评论,我分配到的是携程和艺龙的酒店评论的爬取。

    刚开始是我想用之前用过的scrapy来做这个爬取,但是不知道是不是我用的不太熟练,了解不深入,导致一些问题我自己没有办法处理,而且上网搜索的一些答案我都看不懂,之后我才直到,scrapy如果自己没有一定实力,排错很困难。

    所以还是回到底层python爬虫实现,凡是要一步步来,因为如果我发现网上许多python爬虫都是用urllib,urllib2,bs4,Request等库来实现的,所以先抛开scrapy框架来,回归一些更加基础的爬虫相关库的学习。
    (在进行下面之前请执行pip list查看自己是否已经安装了beautiful soup,lxml,Request和scrapy等第三方库,urllib,urllib2,re和json都是内置库不用考虑,如果没有上面四个第三方库,请用pip install之)

    分析要爬取的网站

    ①携程

    http://hotels.ctrip.com/hotel/

    上面这个是携程酒店页,广度优先的话就是这一层先完成爬去每个酒店评论页的URL,携程酒店页长这样:
    这里写图片描述

    然后再在每个url里面找到评论数据来源再抓下来,这里我们选择上图第一个酒店桔子酒店(北京天宁寺店)为例子,点进去长这样:

    这里写图片描述

    看到图中酒店评论(1423)没有,点开看看:
    这里写图片描述

    貌似我们的要的评论就近在咫尺,但是当我们打开网页源码我们发现它的评论只有第一页的5条,后面的没有了,那么剩下的评论(第2,第3页…)又是怎么获得的呢?

    AJAX:这里就得说说AJAX了,本身什么意思我就不详细说了,我们只要知道AJAX技术是一种异步加载数据的方式,在原来静态网页的天下,每次点击都要重新从服务器再次请求整个网页下来,而其实中间我们需要更新的数据只有一小部分(如果原来请求整个网页是100%的话,那么这一小部分只有5%),这样就造成了大量的带宽浪费,AJAX就是当需要更新部分数据时候,只从服务器加载这一小部分数据,而不用把整个页面又重新下载一遍,AJAX属于前后端数据交互技术,那么我们又要怎么观察AJAX的交互呢?又得如何获得这些动态加载的酒店评论数据呢?我自己用的是chrome所以推荐chrome浏览器自带的开发者工具【Ctrl】+【Shift】+【I】,就可以调出来了,长这样:

    这里写图片描述

    图中我们可以看到现在是评论的第二页,右边啥都没有,先点到Network,再选择筛选器,原来是【All】,现在换成【XHR】(大部分重新加载的AJAX在浏览器中都属于XHR类,当然有部分还可能在JS 类中),这样更加方便找出通过AJAX加载的更新数据,接下就刷新一下页面,让它重新加载第二页评论,结果如图:

    这里写图片描述

    P.s.我这里试了一下,直接刷新会回到最开始的这个页面。最好的办法就是,先点进酒店评论(1420),此时为第一页,打开chrome的开发者工具,选择XHR筛选器,然后点击下一页,就会得到一模一样的上图

    我们可以看到,在右侧的这个URL的内容里面有很多有价值的信息,有Request URL,往下翻,可以看到Reques Headers(Cookie,Referer,User-Agent等伪装头部必备元素~)内容,这里上张图更清晰:

    这里写图片描述

    一般来说,通过Request URL,我们就可以抓到更新加载的评论数据了,但是这个URL打开是这样的,一片空白,不对啊,以往经验来说应该是有显示出json格式的数据的!!后面我以为是请求头request headers或者是referer(有些网站会检查这个请求来源URL,这个referer记录的就是请求来源URL)的伪装问题,但是写上去了问题依旧,但是通过Preview倒是能够看到加载的内容:

    这里写图片描述

    我这里纠结了好几天,也尝试很多办法,可能携程有特殊的反爬虫手段?现在目测只能后面再试试通过Selenium+PhantomJS(无头浏览器)模仿用户正常请求来试试了,但是Selenium也要做功课的呀,外加这篇讲传参的就不涉及了。考虑到最近要准备期末考试了,所以暂时把携程酒店评论抓取的工作挂起,以后有空再折腾- -b

    P.s.今天在开发者头条看到携程酒店研发部研发经理崔广宇的一个分享,感觉之后可以参考再分析

    ②艺龙

    艺龙总的来说给我的感觉没有携程那么复杂,可能携程太出名了吧,又广告,各种耳闻。

    http://hotel.elong.com

    上面这个是艺龙酒店页面,我们以广州的酒店为例子,谁叫我们是广州仔呢,广州的话就是这个:

    http://hotel.elong.com/guangzhou/

    和携程一样又是一列的酒店,长这样:

    这里写图片描述

    我们也可以广度优先先爬去每个酒店的URL,不过这个先放着,我们先看看点进去每个酒店的评论页面,先分析一番,这里我们以上图中的广州珠江新城希尔顿欢朋酒店为例,下面就是点进去,点击点评,呈现出来长这样:

    这里写图片描述

    惯例对比网页源码和网页内容(这里指评论),我们发现和携程一样,艺龙酒店评论页面的源代码中只有5条评论,其他估计也是通过AJAX异步加载的,通过chrome的开发者工具分析交互过程,果然如此:

    这里写图片描述

    上图中是我通过分析评论加载过程得出的,中间省略了一些步骤。

    P.s.强烈建议你花点时间琢磨一下如何利用开发者工具分析交互过程,这有助于你快速找出AJAX加载地址URL

    详细的信息:
    这里写图片描述

    这里写图片描述

    把General下的Request URL复制粘贴到浏览器地址栏,打开,会有这样的返回

    这里写图片描述

    和携程不一样,我们直接打开AJAX请求的URL能够如期地得到我们想要的json格式数据,接下来我们请求这个URL就可以了,不用像静态网页那样通过re(正则表达式)或者xpath定位到某个标签了。

    做到这里,貌似我们已经找到我们想要的数据了,别着急,我们再来分析一下这个AJAX请求的URL的规律:

    http://hotel.elong.com/ajax/detail/gethotelreviews/?hotelId=91245064&recommendedType=0&pageIndex=1&mainTagId=0&subTagId=0&=1467394392854

    1.我注意到上面的URL中有hotelId字段,这里是91245064,和原来这个【http://hotel.elong.com/guangzhou/91245064/】中的数字一样,我就想是不是每个酒店都有属于自己的一个编号,那么为了验证我的想法,我就打开了【http://hotel.elong.com/guangzhou/32001199/】——广州东山宾馆的页面,同样出现了32001199这一串数字:

    这里写图片描述

    我们可以看到,这次AJAX请求的URL是:

    http://hotel.elong.com/ajax/detail/gethotelreviews?hotelId=32001199&recommendedType=0&pageIndex=1&mainTagId=0&subTagId=0&=1467395437371 

    hotelId是32001199和原本【http://hotel.elong.com/guangzhou/32001199/】 中的一样,所以我基本确定,这串数字就是每个酒店都有的编号。

    知道这个又有什么意义?首先知道了酒店有自己的酒店编号,然后又知道了原来通过AJAX请求的URL中的hotelId是等于这个这个酒店编号的,那么我们可不可以只是通过修改这个hotelId来获取不同酒店的酒店评论呢?答案是肯定的,我就不贴试验图了,你们可以自己做试验。

    2.再回来看1里面的hotelId=91245064的那个AJAX地址:

    http://hotel.elong.com/ajax/detail/gethotelreviews?hotelId=91245064&recommendedType=0&pageIndex=1&mainTagId=0&subTagId=0&=1467396059996 

    我们发现pageIndex=1,学过英文的我们能猜到pageIndex应该就是指页码,对比一下这个URL打开的json中的评论和原页面中第一页的评论内容,发现一致,修改pageIndex=2,回车,发现重新加载,内容改变,再对比重新加载的json数据内容和原页面中第二页的评论内容,发现也是一致的,基本可以肯定pageIndex的值就是确定请求第几页的值的字段

    3.通过上面两点对AJAX请求的URL地址的分析,我们知道了我们只要改变hotelId和pageIndex的值就可以请求完艺龙内所有酒店的评论数据,不过如果要用程序实现,我们还需要直到所有的hotelId和每一个酒店内评论最大页面数量

    程序实现

    1.第一步要做的是获取全部酒店hotelId
    (凡事都得小范围试验先,所以还是先拿广州开刀,试着抓第一页全部的酒店编号)

    #! usr/bin/python
    #coding:utf-8
    import urllib
    import urllib2
    import json
    
    from  bs4 import BeautifulSoup as bs
    import re
    
    '''
    crawl page from hotel.elong.com
    '''
    #this part can be replaced by requests 
    place="guangzhou/"
    url="http://hotel.elong.com/"+place
    
    #headers camouflage
    useragent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36'
    headers={
    
        'User-Agent':useragent
    }
    
    req=urllib2.Request(url,"",headers)
    res=urllib2.urlopen(req)
    data=res.read()
    res.close()
    
    '''
    parse and select what i need
    '''
    #BeautifulSoup(data) will transform [data] in unicode automatically
    soup=bs(data)
    hotellinks=[]#define a list for hotellink
    hotelnumbers=[]#define a list for hotelbumber
    
    
    for tagdiv in soup.find_all('div',class_='h_info_base'):
        for tagp in tagdiv.find_all('p',class_='h_info_b1'): 
            for taga in tagp.find_all('a'):    
                hotellink=taga.get('href')
    
                #throw every hotellink to hotellinks list
                hotellinks.append(hotellink)
    
    for hotellink_to_hotelnumber in hotellinks:
        for hotelnumber in re.findall(r'/\d*/',hotellink_to_hotelnumber):
            for hotelnumber_again in re.findall(r'\d*',hotelnumber):
                hotelnumbers.append(hotelnumber_again)
    
    
    print hotellinks,"\n"
    print hotelnumbers,"\n" 

    以下为输出结果为第一页的全部酒店编号,以及URL路径:

    这里写图片描述

    P.s.酒店列表翻页也用了AJAX技术实现动态加载,但是和上面谈论的不一样的是,之前谈论的都是GET方法,但是这里POST方法,有点不一样,还没有深入研究,不过我知道的一点是,如果你直接找到它AJAX请求URL,然后直接打开是获取不了数据的,原因现在推测是请求头的“Content-Type:application/x-www-form-urlencoded;”这里出现的,更加准确的原因得继续研究实验POST方法才能得出。
    【也是尚未完成,没有完成后面全部页面酒店编号(hotelnumber_list)和路径的抓取,待续】

    2.第二步获取每个酒店的评论页面最大值(Pgnum_max)
    【未完成,待续】

    3.最后获取酒店评论信息

    由于前面两部已经获取了酒店编号列表和每个酒店评论页最大值,那么这一步就是基于hotelnumber_list和Pgnum_max做的一个函数(粗略示范一下):

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    import time
    import os
    from os.path import exists
    import json
    import codecs
    import gzip
    import StringIO
    
    import urllib
    import urllib2
    
    import re
    
    
    def getComment(hotelnumber,Pgnum_max):
    
    
        for page in xrange(Pgnum_max):
    
            Comments=[]
    
            page=str(page)
            print "第"+page+"页"
    
            url="http://hotel.elong.com/ajax/detail/gethotelreviews/?hotelId="+hotelnumber+"&recommendedType=0&pageIndex="+page+"&mainTagId=0&subTagId=0&_=1468730838292" 
            headers={
    
                'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36',
                'Accept':'application/json, text/javascript, */*; q=0.01',
                'Accept-Language':'zh-CN,zh;q=0.8',
                'Accept-Encoding':'gzip, deflate, sdch',
                'Connection':'keep-alive',
                'X-Requested-With':'XMLHttpRequest',
                #'Referer':'http://hotel.elong.com/guangzhou/32001005/',
                'Host':'hotel.elong.com'
    
            }
    
    
            #请求AJAX
            req=urllib2.Request(url,None,headers)
            res=urllib2.urlopen(req)
            data=res.read()
            res.close()
    
            #因为data有压缩所以要从内存中读出来解压
            data=StringIO.StringIO(data)
            gz=gzip.GzipFile(fileobj=data)
            ungz=gz.read()
    
            #正则提取
            pattern_Comment=re.compile(r'"content":"\W*"')
            #仍不能完全匹配到所有用户,这里只是匹配到中文名的用户,可能要用到非贪婪模式!
            pattern_username=re.compile(r'"nickName":"\W*"')
            pattern_CommentTime=re.compile(r'"createTimeString":"....-..-..\s..:..:.."')
    
    
            for username in re.findall(pattern_username,ungz):
                # print type(username)
                # print username,'\n'
                Comments.append(username)
    
    
            for CommentTime in re.findall(pattern_CommentTime,ungz):
                # print type(CommentTime)
                # print CommentTime,'\n'
                Comments.append(CommentTime)
    
    
            for Comment in re.findall(pattern_Comment,ungz): 
                # print Comment,'\n'
                # print type(Comment)
                Comments.append(Comment)
    
            #保存成HTML
            comment=",".join(Comments)#list转str
    
            cdir = u'./Comments/'
            if not exists(cdir):
                os.makedirs(cdir)
    
            f=codecs.open(cdir+u'page'+page+u'.txt','wb+','utf-8')
            f.write(comment)
    
    '''
    程序入口
    '''
    #前面也是没有做完,所以酒店编号列表先构造一个
    hotelnumber_list=['32001005']
    #前面没有抓到最大评论页面数,先假定最大有200页
    Pgnum_max=2
    for hotelnumber in hotelnumber_list:
        getComment(hotelnumber,Pgnum_max)

    下面是用存储的page0.txt(商品编号为32001005的第一页信息)作为示范,吐槽一下自己,因为偷懒所以直接在windows下开putty用vim打开的page0.txt截的图,现在贴上去后觉得丑死了….
    这里写图片描述

    免责声明

    本篇文章只是为了分享技术和共同学习为目的,并不出于商业目的和用途,也不希望用于商业用途,特此声明。

    展开全文
  • 其实登录一个网站也好,评论一篇文章也罢,甚至是发表一篇博文,其实都是网站跟“黑客”之间的较量,网站使用各种隐藏的黑科技去验证你是否是机器人,即使这可能会影响体验,而“黑客”则是抓取一切可以利用的东西,...
  • 大众点评评论标签替换文字问题

    千次阅读 2019-01-08 17:10:27
    大众点评评论爬虫的时候发现评论内容会有部分文字被 b标签替换掉 如图: 一看,这是什么鬼,没见过啊,怎么办,然后选中一个 b标签,看到右边的css,如图 注意到background-image:url 这里比较可疑,打开看一下...
  • 本文来源:《哈佛商业评论》 作者简介:斯科特*库克,财捷公司创始人兼执行委员会主席,该公司位于加利福尼亚的芒廷维尤(Mountain View,California)。他也是宝洁和eBay公司的董事。他是《为营销模式纠偏》(本刊...
  • 这个暑假我给自己了个网站  (9) ·  05:  低质量软件编程产生的成本价格细目表  (13) ·  04:  每天读书30 页,一年读24 本书  (14) ·  03:  软件工程师头衔的那些事儿  (1) ·  02:  为...
  • 转载自CU,作者 longnetpro 我们无论在自己学习或者给别人解惑的时候,一定要有严谨和认真的态度,要言之有物,要条理分明,虽然有时得不够好,但是态度一定要端正! 最近看了一些国内比较好的技术网站(这里...
  • 根据Gartner的研究报告,像在Yelp, TripAdvisor, Google Places 和Amazon等很受欢迎的网站,这些行为尤其泛滥。   从哪里寻找购物意见 根据Econsultancy的一份调查报告,在线评论,尤其是发表在像亚马逊这种电商...
  • python爬虫实战---爬取大众点评评论

    千次阅读 2020-08-27 20:25:37
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及...
  • 记录一次爬取淘宝/天猫评论数据的过程 作者:苏剑林 | 发布时间:May 6, 2015 笔者最近迷上了数据挖掘和机器学习,要数据分析首先得有数据才行。对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫...
  • 前言:wordpress算是目前使用最多的博客搭建程序,包括我自己的站点:吃饭用大碗的程序猿 都是用wordpress搭建的,目前选的模板比较简洁,毕竟一开始我就打算一个简洁一点的博客网站。不过后期我还是会换的,哈哈...
  • 如何举报YouTube视频和评论

    千次阅读 2020-09-28 03:03:41
    YouTube is a wild west of content. There are some great videos there, but also some truly awful ones. You can help out by reporting questionable content. YouTube是内容的狂野西部。... 您可以通...
  • 以我差不多四年的 Python 使用经验来看,大概可以按以下这些路子来赚到钱,但编程技能...如果你都不知道的话问题也不大,可以考虑自己开一个淘宝网店或猪八戒服务外包。很多人可能会觉得开淘宝店很困难,其实不...
  • 当时自己比较关注“小凤雅事件”,而微博又是舆论的战场,就想爬取“小凤雅事件”的相关微博以及评论,看看大家的关注点在哪里,于是就行动起来了。 下面是对主要技术的介绍。 二、scrapy介...
  • 例如这里查看《白蛇:缘起》的影评,按下f12后,发现没有对应的影评...打开之后,可以看到在顶部的位置可以选择不同的手机作为当前的调试 f5刷新一下,即可进入手机app的模式了,往下滚动,就能看到共有多少条评...
  • 即便是一个动态网站可能也会有一些组件或信息常量是贯穿页面整个生命周期的。在一个博客站点内,针对单个 blog post 的类别列表不大可能在页面查看间经常性地变更。每次都通过一个对数据库的查询加载此信息相对比较...
  • 豆瓣评分与观众 对于一部国产网剧,如果想分析它的评分与评价,那么似乎只有豆瓣这一个网站可以选择了。 而每一个学python的人,应该写过豆瓣,拉勾,网易云“三剑客”的爬虫吧? 那么爬虫部分就不一一赘述了。 ...
  • 罗技Harmony One遥控器评论

    千次阅读 2020-10-04 11:51:45
    它使我可以选择保留该登录名,并将旧设置移至新的遥控器,减去我已经过的一些自定义按钮,或者从头开始创建新的登录名。 我升级了,遥控器就可以了。 一切如我所愿,具有更明亮的屏幕和升级的图形。 "I just want...
  • 会抓个网页总感觉还不够,平时在空间里经常会遇到秒赞或者是秒评论的,现在也可以自己用爬虫在qq空间...1.1 首先先用cookie登录qq空间,抓取到页面的内容,用pc端打开自己的qq空间,按F12进入开发者模式,可以看...
  • pyhton爬取爱豆(李易峰)微博评论(附源码)

    千次阅读 多人点赞 2020-11-18 21:39:54
    今日目标:微博以李易峰的微博为例:https://weibo.com/liyifeng2007?is_all=1 然后进入评论页面,进入XHR查找真是地址:https://weibo.c...
  • 其实只要充分了解Python的功能可以解决哪些现实问题,这个问题就可以...如果你都不知道的话,你可以开个网店,或者去猪八戒服务的外包。不管是web开发还是爬虫,都需要找到好的项目。最好的就是帮一些证券的人...
  • 1、网络爬虫都能干什么@冰蓝之前在北京买房...@陈乐群上次发现Android QQ和iOS QQ可以显示网络状态(2G/WiFi)之后,突然想到,这样子好像可以监视某人的出行和作息规律。简单的来说,在家里或者工作的地方,一般是有...
  • 关于天猫(淘宝)评论爬虫

    千次阅读 2018-02-23 08:41:04
    我们已经找到这些数据包,需要访问这些数据包仍然需要访问头,带着访问头去访问网页我自认为是一个好习惯,虽然有时候这样显得很臃肿,但是这样可以减少很多问题。在你成功访问到内容后,利用beautifulsoup、正则...
  • 首先恭喜一下我最喜欢的歌手(之一)周杰伦的《晴天》成为网易云音乐第一首评论数过百万的歌曲! 通过结果发现目前评论数过十万的歌曲正好十首,通过这前十首发现: 薛之谦现在真的很火啦~几乎都是男歌手啊,男歌手...
  • 此文章的主旨是希望过于专注.NET...恕我愚钝,此主旨在文中表达不够清楚,看评论中很多朋友误解了,特此说明。 另外,本文中的观点并不全部是我个人的想法,相当一部分来自我以前聊过天的某些大牛,他们很多来自微
  • 原理:其实就是利用基于chromium内核的浏览器自带的devtools对所有请求进行排查找出包含作品链接的请求,然后用代码模拟请求去获得数据,再根据url下载作品保存就行了,包括一些网站的自动注册登录、操作都可以模拟...
  •  现在电商都不太好,特别是淘宝,天猫上的电商,要... 今天秦刚老师给大家分享美国一个比较有趣而另类的电商公司,我们看看别人怎么通过AMAZON用户评论一个非常赚钱的电商公司。  位于美国新泽西州的C
  • 5G评论员:张冰,翟劲松,刘亚涛,王君,钱志浩,陈俊,蒋明亮,王建硕,老华   大家对5G评论上海站的期望   老华:第一次聚会,非常感谢明亮以及众多的地主,今天我们5G评论上海讨论组从这里开始了。希望经过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,066
精华内容 8,426
关键字:

哪里可以做可以评论的网站