python爬虫淘宝评论_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回车。

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 itemin 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 iin 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)

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A20 网卡驱动分析

网卡芯片为realteak 8201 1. net_device结构体的分配和注册 1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c" wemac_probe() ndev alloc_etherdev(sizeof(struct wemac_board_info)); 分配 ret register_netdev(ndev); …

安装用户debian7安装oracle11g

改章节笔者在北京游玩的时候突然想到的...这几周就有想写几篇关于安装用户的笔记,所以回家到之后就奋笔疾书的写出来发表了 apt-get install gcc g make binutils libc6 libc6-dev libstdc6 libstdc5 rpm gawk alien ksh lesstif2 libaio1 linux-headers elfutils…

python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

关于UDP网络编程UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。UDP是面向非连接的协议,它不与对方建立连接,而是直接把要发的数据发给对方。【UDP网络编程的特点】1,每个数据中都给出了完整的地址信息&#xff…

python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮

我有一个程序在画布中放置复选按钮,当选项(另一个复选按钮)被选中时。我有另一个选项(另一个复选按钮)来画线。为了画线,首先我应该选择checkbutton“draw a line”,然后单击放置在画布中的任何checkbutton,另一个单击画布上的任何…

各个层次的gcc警告

各个层次的gcc警告 从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attribute__ ((unused)); 指定该变量为"未使用的".即使这个变量没有被使用,编译时也会忽略则个警告输出. 文件级:在源代码文件中诊断(忽略/警告) 语法: #pragma GCC diagnostic [er…

【转】C++ GetLastError() 返回值对应表

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足,无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错…

hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

今天梦翔儿,成功实现hadoop编程,将本地文件夹中多个文件,合并为一个文件并上传到hdfs中直接上代码:PutMerge.javaimport java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataIn…

js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

在 Design Tools 中,组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素。云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台,同样拥有自由拖拽的可视化画布。那么在云凤蝶的自由画布中,对齐规则是怎样的&…

GCC 使用摘记

1. 几个子程序和说明cc1C 的实际编译程序cc1plusC 的实际编译程序collect2在不使用 GNU连接程序的系统上,用来产生特定的全局初始化代码crt0.o为每个系统定制的初始化和结束代码libgcc默认连接的 gcc 例程库libstdc默认连接的 g 例程库 2. 几个重要的和 GCC 协同工作…

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会,在我们日常生活中交际表达能力非常的重要,但是还是有一部分人比较内向,不善于表达自己的内心,也不喜欢和别人接触,那么这一类人从事哪些行业比较合适呢?下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数,包含上述若干…

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题。在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的,这次看AM335X的代码顺手写一下分析&#xf…

python生成验证码_python之验证码生成(gvcode与captcha)

今天向大家总结一下python在做项目时用到的验证码生成工具:gvcode与captchagvcode全称:graphic-verification-code安装:pip install gvcode使用:import gvcodes, v gvcode.generate() #序列解包s.show() #显示生成的验证码图片pr…

设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

(3)单一职责原则 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的…

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天,我们的生活也开始趋向于智能化,智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi,可是使用的时候得一个个去控制,数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

eventfd以及epoll原理分析

这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多,但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的,这两天将内核这两个部分的相关代码看了下,也终于明白了这两个…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…

iOS vs. Android,应用设计该如何对症下药?

摘要:从iOS到Android,两大平台应用设计有何不同?又都存在什么样的问题?Android定制性太高,该如何进行UI设计?在CMDN CLUB第28期活动中,咕咚网高级产品经理王磊,从iOS、Android谈起&a…

postman数据保存在哪里_Postman 历史记录导出的解决方案

Postman 可以说是我在 CTF 中使用最多的工具了。它确实非常好用,但我并没有完全掌握它的使用之道,因此大量的历史请求堆在一起,显得环境无比混乱。 虽说是有想要改变的想法,但这些历史记录还是非常重要的,一时间难以割舍。于是便开始寻找导出的方案。 indexedDB 我们知道,…

cs8900a网卡驱动--寄存器

1. CS8900内部有一个4k的RAM用于访问其内部寄存器,称为PacketPage。 2. LineCTL 网卡状态设置 从上图看到,此寄存器的6,7位用于设置网卡的收发使能。8,9位用于设置网卡状态。是10BASE-T还是 AUI。下面这图更详细介绍了8&…