Python爬取淘宝店铺和评论
1 安装开发需要的一些库
(1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可。
(2) 安装自动化测试的驱动selenium:在命令行中输入pip install selenium回车。
(3) 安装标签解析库pyquery: 在命令行中输入pip install pyquery回车。
(4) Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,下载anaconda,安装后配置环境变量,在path中添加E:\Anaconda3\anaconda\Library\bin,重启电脑使环境变量生效,安装jieba库,在命令行中输入pip install jieba回车。
(5) 下载ChromeDriver,官方网址为:http://chromedriver.storage.googleapis.com/
index.html,并将chromedriver.exe放在Python安装目录的Scripts文件夹下。
2.实现
2.1 搜索模块
搜索功能即一个数据框和一个搜索按钮组成,点击搜索之后会跳转到显示框的界面,之后点击爬取数据可以在淘宝网站中对该商品进行搜索,并且爬取相关店铺的信息,并储存到数据库中。
界面显示用到Tkinter库,Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
搜索主要用到selenium,也就是自动化测试工具,测试中根据pyquery中的提供的方法,在得到网页源码的情况下,根据HTML中的标签找到输入框,搜索按钮和翻页的按钮,模拟人工输入和点击,实现自动化控制,最后根据标签提取出相应的信息插入数据库中。
因为每个网站因网速的的问题都有响应时间,用WebDriverWait(driver,50)设置响应时间为50s,也就是响应超过50s便出现异常。提取数据时我用的是find_element_by_css_selector()方法,也就是标签选择器,可以定位到相应的区域。
Python连接数据库用到pymysql,PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。当得到标题,店铺名称,地点,购买人数,店铺链接时,以“|”分割拼接成字符串,作为参数传递给insert_data()方法,插入到数据库中。因为可能会有异常,所以放到try块中。
爬取数据的实现主要是用到了Pyquery、selenium库,以下代码主要实现了对淘宝的检索、翻页和对数据的提取。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# 设置网站最大响应时间 wait = WebDriverWait(driver, 50 ) class TaoBaoSearch: # 初始化,默认搜索为None,创建数据库连接 def __init__( self ,search = None ): self .name = search self .mysql = to.Data_oper() # 对淘宝网的搜索 def search( self ): # 设置源网站,这里设置淘宝网站为源网站 driver.get( "https://www.taobao.com/" ) #J_TSearchForm > div.search-button > button # “q”为淘宝首页输入框的标签,这里定位到该输入框,并设置要搜索商品的名字 imput = driver.find_element_by_id( "q" ) imput.send_keys( self .name) # wait.until()该方法的作用是加载出来搜索结果总页数之后开始往下执行 pageText = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total" ))) total = re.search( "\d+" ,pageText.text) # 该方法返回搜索结果的总页数 return total.group( 0 ) # 提取出相应的数据 def parseHtml( self ): html = driver.page_source #获取网页源代码 doc = qp(html) # 得到到class为m-itemlist下面的class是.items .item的div iteams = doc( ".m-itemlist .items .item" ).items() # 根据标签选择器提取出需要的数据 for item in iteams: # src=item(".pic .img").attr("src") src = item( ".row .J_ClickStat" ).attr( "href" ) # 该店铺的链接 person = item( ".row .deal-cnt" ).text() #购买该商品的人数 title = item( ".row .J_ClickStat" ).text().split( "\n" ) # 标题 shop = item( ".row .shopname" ).text() # 商品 location = item( ".row .location" ).text() # 地区 # 将提取到的数据放到数组中保存起来 data = [] data.append( str (title[ 0 ].strip())) data.append( str (shop.strip())) data.append( str (location.strip())) # 剔除无用字 data.append( str (person[: - 3 ].strip())) data.append( str (src).strip()) # 调用mysql.insert_data()方法将提取到的数据插入到数据库中 self .mysql.insert_data(data) # 对网页进行翻页的方法 def nextpage( self ,pagenumber): # 定位到翻页的按钮前的输入框,也就是对其进行跳转 pageInput = driver.find_element_by_css_selector( "#mainsrp-pager > div > div > div > div.form > input" ) pageInput.clear() pageInput.send_keys(pagenumber) # 定位到跳转按钮,对其进行翻页 pageButton = driver.find_element_by_css_selector( "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit" ) pageButton.click() wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span" ), str (pagenumber))) self .parseHtml() # 定义主函数,调用上面的的方法 def main( self ): total = int ( self .search()) for i in range ( 2 ,total): self .nextpage(i) self .mysql.close() |
2.2 显示模块
当点击搜索之后,考虑到可能搜索的商品会有本地储存,所以没有对其直接搜索,而是在显示框中增加了一个爬取数据的按钮,该按钮即对商品进行搜索,而本地数据就是对数据库的data表进行查询,并将数据显示到界面上来。排序是对本地数据按购买人数进行排序,并显示在文本框中,在显示行数后面输入数字后,可以控制文本框的显示条数,默认显示10条。一键删除即把data表中的数据清空。
本地数据:对数据库中的data表进行查询,并将信息显示到文本框中,其中每条数据中间以“——”分开,每个字段之间以“|”分隔,因为考虑到店铺名称或是标题太长而不整齐,所以每个字段显示10个字符。
排序:当点击排序之后,会查询出数据库中每条数据的购买人数和店铺名称,并且以“,”分割拼接成字符串,设置一个元组(即数组性质),并根据用户输入的显示行数,控制元组的长度,具体实现:根据从数据库中得到的数据,每条每条的读取,当读取条数达到用户输入的显示行数的值,对元组中的数据用sort(reverse=True)对其进行从大到小排序:原理是:因购买人数一个月不超过一百万,所以得到的购买人数的最大长度为6位,这样,当每次读取的购买人数的长度不够6位时,在其前面补0,这样,购买人数的长度都为6,对其拼接的格式为“购买人数,店铺名称”,因为拼接后为字符串类型,所以用shot排序时会根据前面的购买人数进行字典序进行排序,进而前n条数据就排好序了,接着,每读取一条数据就对元组中最后一个数据进行比较,若是大于其数值,就插入到元组中,最后返回元组,这样,就实现了显示n条购买人数最多的数据。清除数据:对文本框中的数据进行清空,同时,删除data表中的数据。
以下代码是一个排序的算法,其主要作用是在界面上显示多少行数据,主要思路为:根据用户输入的数字创建一个数组,读取数据库中得到数据,分离出来购买人数并转换成int类型,将数据每次添加一个到数组中,当数组的长度等于用户想要显示最大行数时,对其数组中的数据从大到小进行排序,接下来,每当读取一个数据之后,就对数组中最小的那个进行比较,如果比起小,就跳过,否则,对该数据进行插入操作,并删除之前最小的那个数据,最后数组中保存的就是购买人数最多的前n条数据。
主要代码如下:

#对数据进行排序,data为购买人数
def shot_data(self,data,i=10): # i为用户想要显示的最大行数,默认为10行
top=[]
if i>len(data):
i=len(data)
for x in data:
if len(top)<i: # 控制数组的长度,另其大小等于i
top.append(x)
if len(top)==i:
top.sort(reverse=True) # 数组内的数据进行排序
else:
l=len(top)
y=len(top)
t=1
if x>top[l-1]: # 判断其数值是否大于数组内的最小值
while x>top[l-t] and y>0: # 控制循环条件
t+=1
y-=1
if y!=0: # y的值若是==0,那么该数值就是最大值
for c in range(1,t):
top[l-c]=top[l-c-1]
top[l-t+1]=x
else:
for c in range(1,t):
top[l-c]=top[l-c-1]
top[0]=x
return top # 返回装有最大的前i个数的数组

2.3 评论模块
点击查看链接之后会出现一个搜索框,即根据店铺名称搜索出相关的连接,点击查看评论之后可以对其店铺进行爬取,最后显示在评论框中。分析就是对评论进行关键词提取,并按权重显示出前n个词。点击查看评论进行自动化测试。
搜索店铺链接:根据用户输入的信息对数据库进行模糊查询,返回所有的匹配信息。并显示在文本框中。
爬取评论:首先清空comment表中的数据,根据curselection()方法得到用户选中的链接,接着对该链接进行爬取,在进入该店铺时,会提示需要登录,这样会对我们的自动化测试造成一定的阻碍,这里,我根据pyquery中提供的标签选择器,找到关闭按钮,模拟点击进行关闭,当进入店铺后,依旧是先得到该网页的源代码,根据标签选择器进行相应的操作,爬取到的评论时间,评论和购买物品以“|”拼接成字符串,显示到文本框的同时插入到数据库中。
评论分析:jieba是Python的中文分词组件。当查询到comment表中所有数据时,将每一条数据拼接成一个字符串,接着用jieba.posseg中的cut()方法,将评论分割成单个词并标注词性,用startswith('a')、startswith('v')得到形容词和动词。最后用jieba.analyse.extract_t
ags(v,topK=10)方法得到动词、形容词中权重较大的前10个词。
以下代码是对评论进行关键词的提取,用到了jieba库中的一些方法。
主要代码如下:

def dis_an(self):
# 清空显示界面
self.txtMess.delete(1.0,END)
t=to.Data_oper()
# 得到数据库中的存储信息
test=t.dis_only_discuss()
# 定义字符串adg,v
adg=""
v=""
# 对评论进行分割并标注词性
word=psg.cut(test)
# w为词意,f为词性
for w,f in word:
# 判断词性是否为形容词
if f.startswith('a'):
print(w)
adg=adg+","+w
# 判断词性是否为动词
elif f.startswith('v'):
v=v+","+w
# 根据该词的权重提取出前5个词
tags=jieba.analyse.extract_tags(adg,topK=5)
tags1=jieba.analyse.extract_tags(v,topK=5)
Python爬取淘宝店铺和评论的更多相关文章
- 【Python爬虫案例学习】Python爬取淘宝店铺和评论
安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动sel ...
- Python 爬取淘宝商品数据挖掘分析实战
Python 爬取淘宝商品数据挖掘分析实战 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 爬取淘宝商品 ...
- 甜咸粽子党大战,Python爬取淘宝上的粽子数据并进行分析
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 爬虫 爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览 ...
- 使用Python爬取淘宝两千款套套
各位同学们,好久没写原创技术文章了,最近有些忙,所以进度很慢,给大家道个歉. 警告:本教程仅用作学习交流,请勿用作商业盈利,违者后果自负!如本文有侵犯任何组织集团公司的隐私或利益,请告知联系猪哥删除! ...
- 一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
[一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. 很多人学习python,不知道从何学起.很多人学习python,掌握了 ...
- python 爬取淘宝的模特照片
前段时间花了一部分时间学习下正则表达式,总觉得利用正则要做点什么事情,所以想通过爬取页面的方式把一些美女的照片保存下来,其实过程很简单. 1.首先读取页面信息: 2.过滤出来照片的url地址: 3.通 ...
- python爬取淘宝排名
import timeimport jsonimport requestsimport xlrdimport randomimport os from xlutils.copy import copy ...
- 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序
第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...
- Python 爬取淘宝商品信息和相应价格
!只用于学习用途! plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) :获得商品价格和view_pri ...
随机推荐
- 我的第一篇java笔记
什么是程序 程序通常指完成某些事物的一种既定方式和过程. 在日常生活中,可以把程序看成一系列动作的执行过程和描述. Java介绍 Java是Sun Microystems于1995年推出的高级编程语言 ...
- pwnable.kr-leg-witeup
做过后其实知道,是很简单的一段代码,也很容易看懂,看懂后计算key1.key2.key3之和即可. main 汇编: 嗯,看来keyx的返回值是r0了,详细分析r0值. key1: 在arm状态下,r ...
- 基本HTML结构
配置:在vs code中声明页面为html,然后添加open in browser,view in browser插件通过快捷键alt+b实现在浏览器中查看编写好的html界面 基本成分: <! ...
- mysql数据库分区和分表
转载自 https://www.cnblogs.com/miketwais/articles/mysql_partition.html https://blog.csdn.net/vbirdbest/ ...
- anaconda使用方法
我是用的win10.想写爬虫,所以使用了 anaconda .总结一下使用的方法. 安装阶段跳过.: 再终端输入 jupyter notebook 然后就会在. 浏览器显示一个网页.其实这个也不 ...
- java 小数转换成二进制
32位单精度二进制 = [1个符号位] [8个阶码位] [23个尾数位] 64位单精度二进制 = [1个符号位] [11个阶码位] [52个尾数位] 小数 = [正负符号位] [整数部分] . [小 ...
- 通过PHP调用微信JSSDK实例
JSSDK使用步骤: 1. 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 2. 采用http GET方式请求获得access_token(有效期7200秒). 3. ...
- java进阶系列之装饰器模式
1.介绍 装饰器模式顾名思义就是装饰某个对象的,是一种结构型模式.装饰器模式允许向一个现有对象添加新的功能,同时不改变其结构,用户可以随意的扩展原有的对象.它是作为现有的类的一个包装.装饰器模式一方面 ...
- 修改Tomcat控制台标题
1.在tomcat的bin目录下新建文件setenv.bat 2.重启tomcat即可
- hbase-读操作
(学习笔记) client和regionServer连接,通过rowkey查找对应的region 多个列簇生成多个storeScaner 每个storeScaner生成一个MemstoreScanne ...