用Python爬取京东商品评论(1)

Python网络爬虫所需要的模块

本次爬虫程序需要的模块有:
requests、BeautifulSoup、chardet、re、json、csv
以下先来分别介绍这几个模块的用处

1.request模块

利用requests模块我们可以获取所要爬取网页的html内容。使用requests.get(url)可以返回对应网页的连接,在调用.text或者.content来获取对应的网页html内容。其中.text是以字符串的格式返回网页内容,.content是以二进制字节的形式反回网页内容,两者有不同的用处。例如有些以.text返回的网页内容会出现编码格式不对导致的乱码问题等。
代码示例:

goods_content = requests.get(url).content

返回

<class 'bytes'>

对于.text返回<class 'str'>

为什么这里用.content就是因为在这里调用.text时会出现汉字乱码的问题.

2.chardet

对于网页乱码的问题,我们需要首先在网页的源代码处观察网页设计者编写网站时所使用的编码格式。第一种方式很简单,一般在源代码的开头出都会给出。例如

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

可以看出第一个网页的编码格式是utf-8格式的编码,第二个页面的编码格式是gbk编码,如果你在解析utf-8编码格式的网页时默认用了gbk的格式进行解析,那么就会出现乱码的问题,这时需要调用.decode()或者.encode()函数进行对应的格式变换,相应的内容可以参考Python官网Documents encodedecode
对于几种编码格式的资料可以参考http://blog.csdn.net/fennvde007/article/details/20769179

第二种代码的方式就是利用chardet模块。利用chardet的detect()函数获取网页的编码格式。例如

status = chardet.detect(goods_content)      #判断网页的编码格式

返回

{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

通过encoding属性可以看出网页的编码格式为utf-8模式。
所以在此处,为解决乱码的问题。对爬取下来的内容调用.decode(‘utf-8’)进行格式转换

content_encode = goods_content.decode('utf-8')      #将爬取得二进制网页内容解码成utf-8编码格式

3.BeautifulSoup模块

这一块的部分可以参考我之前写的BeautifulSoup的几个方法BeautifulSoup中一些函数的用法归纳
利用BeautifulSoup对网页节点进行查找可以有两种方法。第一种利用.运算直接查找
例如soup.a soup.title
第二种就是利用find()和find_all函数进行查找
find()函数只返回第一个所要查找的节点标签的类型
find_all()函数以列表的形式返回所有要查找的节点标签的类型
函数的参数可以为所要查找的节点标签类型,例如

p_label = soup.find_all('p')

也可以利用attrs参数来查找指定属性的对应标签,例如

p_label = soup.find('p', attrs = {'class':'ui-page-s'})

在爬虫中主要就是利用BeautifulSoup返回的解析树,根据你需要获取的信息,对应到网页源代码中相应的标签节点,利用soup.find和soup.find_all()去一层一层筛选节点,以此来获取你需要的信息。
例如:

    #找对应的id标签
    J_goodsList = soup.find_all('div', attrs={'id': 'J_goodsList'})[0]
    gl_i_wrap = J_goodsList.find_all('div', attrs = {'class':'gl-i-wrap'})
    for label in gl_i_wrap:
       a_label = label.a
       a_href = a_label['href']

就是首先找到属性id为’J_goodsList’的div节点,接下再在该节点下查找所有属性class为’gl-i-wrap’的div节点,对返回的div节点列表进行遍历,遍历的过程中只获取div下的a标签,在获取a标签的属性值href。从而获取对应商品的链接网站。

最后要指明利用这样访问节点的方式进行检索不是不可以,在工程量减小的时候可以实现,但是当网页比较复杂,节点标签较多的时候,你很难将你需要的内容直接对应到某一个或某几个节点,这个时候利用xPath或CSS的模式进行检索,再利用浏览器的检查(F12),两者可以很方便的生成你想获取信息的xPath或CSS路径。这里暂时不介绍这方面的知识。

4.re正则表达式模块

正则表达式对于检索文档信息、对字符串内容进行检索,特别是对于文本的处理时是十分必要且效率很高的。相关资料也很多,可以参考Python正则表达式指南
对于本文的爬虫,利用re模块是为了方便的获取对于商品的信息,获取这些信息的原因是为了后面在爬取评论时,对于京东评论网页构建Query String Parameters里的参数。这里只贴上代码,示例正则表达式模块的使用,对于参数的用处放在后面再将
首先构建正则表达式

#利用正则表达式匹配页面所需信息
re_skuId = re.compile(r'skuId=\d+')     #获取商品的skuId值
re_https = re.compile(r'https:')        #对网站格式的处理
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')      #提取出JSON格式

应用

skuId = re_skuId.search(page_text).group()      #获取sku的值
productId = re.search(r'\d+', skuId).group()       #获取product的值
cont = rex.findall(t)[0]         #将爬取下来的内容转化成可以被json解析的字典格式

5.json和csv模块

这两部分是格式转换的模块,json是为了将对爬取下来的评论网页解析成Python方便处理的字典格式,json有.load()和.loads(),dump()和dumps()。loads()是将json格式转换成Python方便处理的字典格式。而dumps()方法是将Python的字典格式转换成json格式。
csv模块在本文的爬虫中是为将爬取下来的评论以csv文件的格式保存。
代码如下:

cont = rex.findall(t)[0]         #对网页内容进行清理,获取json格式的部分
con = json.loads(cont)  #将爬取下来的内容转化成可以被json解析的字典格式      
def Insert_To_Csv(csv_file, content):
    with open(csv_file, 'w') as f:
        title = ['ItemName', 'Time', 'Comment','Score',"Assess"]         #CSV文件的标题
        spamwriter = csv.writer(f, delimiter = ',')     #','分割符
        spamwriter.writerow(title)          #写入标题
        for key, value in content.items():
            for page in value:         #先遍历每一页
                for comm in page:         #再遍历每一页下的评论
                   csv_list = comm
                   csv_list.insert(0,key)
                   spamwriter.writerow(csv_list)

相关资料可以参考官方Documents csv

这些是进行网络爬虫大致需要的模块,后续还有其他比较重要的模块再继续进行补充,接下来再对用Python爬取京东评论的思路和方法进行介绍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章