python抓取网页数据(是不是突然感觉网络爬虫很简单?代码就完全解决了)

优采云 发布时间: 2022-04-18 01:12

  python抓取网页数据(是不是突然感觉网络爬虫很简单?代码就完全解决了)

  网络爬虫对于大数据专业的同学可能并不陌生,所以在说网络爬虫之前,博主先给大家介绍一下我们平时使用的浏览器的工作原理,只要你了解普通浏览器的工作原理,那么网络爬虫就变得简单了。

  下图是浏览器正常工作原理的流程图:

  

  首先我们可以看到有四个进程:

  (1)我们先在浏览器中输入url(网址);

  (2)浏览器会向指定的服务器发送一个HTTP请求。请求的方式有两种:一种是get,另一种是:spot。那么这两者有什么区别呢?大家可以这样理解: get是指从服务器下载我们需要的数据,spot是我们上传(粘贴)到服务器的数据;

  (3)服务器收到浏览器的请求后,会生成一个http响应给服务器;

  (4)其实html的源码一般人是看不懂的,所以浏览器会处理,最后给我们展示一个丰富漂亮的网页!!!

  介绍完普通浏览器的工作流程后,我们启动我们的网络爬虫。网络爬虫:模拟浏览器网页,下载我们需要的网络资源的程序,其实本质上就是一个假的http请求。好的,开始我们的代码部分(说明:使用python环境)

  首先我们在python中加载第三方库:re、urllib、json、time,三个库

  #加载第三方库

import urllib

import re

import json

import time

###

#输入网站

url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv6992&productId=8758880&score=0&sortType=5&page=2&pageSize=10&isShadowSku=0&rid=0&fold=1'

#1:模拟浏览器的http请求部分

#html = urllib.request.urlopen(url)

#2:模拟响应过程

#html = urllib.request.urlopen(url).read()

#我们可以打印print(html)看,如果源码出现乱码,我们再响应过程部分进行编码设置:常用的编码有:utf-8,gbk,gb18030

#完整的模拟浏览器的http请求过程和http响应的过程

html = urllib.request.urlopen(url).read().decode('gbk')#此处已经经请求和响应过程合并

print(html)

#由于读取到的源码不是标准的 JSON 格式,因此需要使用进行处理

json_data = re.search('{.+}', html).group()#正则表达式处理

data = json.loads(json_data)# 将json格式数据转为字典格式(反序列化)

  现在爬取1页评论数据,代码运行:

  #忘记每行代码的目的,请看上面备注

import pandas as pd

import urllib

import requests

import re

import json

import random

url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv6992&productId=8758880&score=0&sortType=5&page=2&pageSize=10&isShadowSku=0&rid=0&fold=1'

html = urllib.request.urlopen(url).read().decode('gbk')

print(html)

json_data = re.search('{.+}', html).group()

data = json.loads(json_data)

data['comments']

  运行之后,我们就可以得到我们需要的数据评论数据了。

  

  是不是突然觉得爬网很容易?几行代码就可以彻底解决,但别忘了这只是爬取一页数据。如果我们需要爬取多个页面,则需要我们自己编写和爬取。为了大家方便,博主自己也写了一个循环爬虫的代码如下:

  all_url = []

for i in range(0,10):

all_url.append('https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv6992&productId=8758880&score=0&sortType=5&page='+str(i)+'&pageSize=10&isShadowSku=0&rid=0&fold=1')

allh_data = pd.DataFrame()

for k in range(0,10): #爬取10页的数据

print("正在打印第{}页的评论数据".format(k+1))

html_data = urllib.request.urlopen(all_url[k]).read().decode('gb18030')

json_data = re.search('{.+}', html_data).group()

all_data = json.loads(json_data)

alls_data = all_data['comments']

referenceName = [x['referenceName'] for x in alls_data] # 提取商品的品牌名

nickname = [x['nickname'] for x in alls_data] # 提取商品购买用户的昵称

creationTime = [x['creationTime'] for x in alls_data] # 提取购物时间

content = [x['content'] for x in alls_data] # 发表时间

all_data_hp = pd.DataFrame({'referenceName': referenceName,

'nickname': nickname,

'creationTime': creationTime,

'content': content})

allh_data = allh_data.append(all_data_hp)

time.sleep(random.randint(2, 3))

print(">>>爬取第{}结束.......".format(k+1))

allh_data.index = range(len(allh_data))#重设dateframe的index

  然后最后可以得到以下数据:

  

  如有任何问题,请发表评论,博主将尽力解答。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线