python动态爬取,孔夫子旧书网

python爬取孔夫子旧书网的店铺评论

python2.7.15

这次爬取的是动态网页,所谓动态网页就是动态网页是指网页文件里包含了程序代码,通过后台数据库与Web服务器的信息交互,由后台数据库提供实时数据更新和数据查询服务。它的数据不会直接出现在网页的源码里,它是通过js、xhr等文件动态加载的,比如一些网页里的商品信息,用户评论。

这次爬取的孔夫子旧书网的店铺评论就是存放在js文件里的,想要爬取它首先要找到网页对这个文件的请求,这个可以在浏览器里右键审查元素来找

一、查找对应文件

首先打开浏览器,孔夫子旧书网,书店区。右侧有很多排行榜,也就是书店列表,我们可以挑一个进行操作比如这个销量排行榜,点进去我们可以看到2000条书店信息。随便点一个书店进去,右侧书店信息里有书店的好评率等评价信息,点进去,就找到我们想要的评论列表啦。在这里插入图片描述

评论对应的js文件怎么找呢?右键审查元素,Network,刷新,这些文件就出来了。在这里插入图片描述
现在需要筛选出评论对应的那个文件,这些文件一班为js或xhr在这里插入图片描述
这个就是了,格式类似于python的字典,每一条对应一条评论,包括评论者,商品信息,评论,评论日期等。

在它的headers里我们可以看到它的URL和请求方式等信息,稍后我们会用到。在这里插入图片描述

二、上代码

有了评论的js文件的URL我们发现,这个URL是有规律的,我们只需要更改它的userID和page就可以得到列表里所有店铺的所有评论。

url = "http://shop.kongfz.com/shop_list_7_1.html"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
content = response.read()
pattern = re.compile('<td class="wd310"><a href="(.*?)" target="_blank"')
shoplist = re.findall(pattern, content)
for i in shoplist :
    shopuserid(i)

这一部分是得到shoplist的代码,即获取列表里每一个商店的网址,遍历shoplist得到shopid,然后执行shopusderid函数

def shopuserid(i) :
    url = i
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}
    request = urllib2.Request(url, headers=headers)
    response = urllib2.urlopen(request)
    content = response.read()
    pattern = re.compile('userId":(.*?),')
    userid = re.findall(pattern, content)
    userId = userid[0]
    print userid[0]
    xinyu(userId)

由shopid得到对应商店的网址,在其源码中获得该商店的userid,执行xinyu函数,获取该商店的评论。

def xinyu(userId) :

    for q in range(1,1000):
        f = open('kong.txt', 'a+')
        url = "http://xinyu.kongfz.com/seller/index/getUserReview/?pageCurr=" + str(q) + "&pageShow=20&userId=" + str(userId) + "&type=fromBuyer&rating=all&_=1541333232981"
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent': user_agent}
        request = urllib2.Request(url, headers=headers)
        response = urllib2.urlopen(request)
        content = response.read()
        a = json.loads(content)
        for n in range (20):
            appraiserNickname = a['data'][n['appraiserNickname'].encode('utf-8')
            f.write(appraiserNickname + '\n')
            con = a['data'][n]['content'].encode('utf-8')
            f.write(con + '\n')
            itemName = a['data'][n]['itemName'].encode('utf-8')
            f.write(itemName + '\n')
            reviewTime = a['data'][n]['reviewTime'].encode('utf-8')
            f.write(reviewTime + '\n' + '*********************' + '\n')
            insert_kongfuzi = ("INSERT INTO kongfuzi(姓名 , 评价 , 商品 , 日期)" "VALUES(%s,%s,%s,%s)")
            data_kongfuzi = (appraiserNickname , con , itemName , reviewTime)
            cursor.execute(insert_kongfuzi, data_kongfuzi)
            conn.commit()
        f.close()

这个url对应的是一个json文件,请求方式是get,你可以用request.get方法,也可以像我这样写,就是有点麻烦。将得到的content传给json.load方法,将得到的字符编译成一个字典,然后从字典里取出你想要的信息,重新编码后就可以写入文档或数据库啦。

三、json

JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。

Json 模块提供了四个方法: dumps、dump、loads、load
josn.dump()、josn.dumps() 是把python对象转换成json对象,即编码。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串。
解码是把json对象转换成python对象的一个过程,常用的两个函数是loads和load函数。区别跟dump和dumps是一样的

猜你喜欢

转载自blog.csdn.net/memoirs_pz/article/details/84202764
今日推荐