爬取淘宝网商品的名称,价格,付款人数
- 完整代码
- def getHTML()讲解
- def findMS(html)讲解
- def download(data)详解
- 需要改进的地方
步骤一:提交商品搜索请求,循环获取页面
对应函数:getHTML(url)
步骤二:对于每个页面,提取商品名称和价格信息
对应函数:findMS(html),其中ilt为结果的列表类型
步骤三:将信息保存到csv文件
对应函数:download(data)
完整代码
运行结果:
先上代码,再逐个分析函数。
import requests
import re
import csv
def getHTML():
name = input('请输入爬取商品的名字:')
start_url = 'https://s.taobao.com/search?q={}&s='.format(name)
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/70.0'
}
path = 'F:\mycookie.txt'
with open(path, 'r')as f:
mycookies = f.read()
mycookies = mycookies.split(';')
cookies = {}
for cookie in mycookies:
name, value = cookie.strip().split('=', 1)
cookies[name] = value
pages = input('请输入爬取的商品页数:')
goods = ''
for i in range(int(pages)):
url = start_url + str(i * 44)
r = requests.get(url, headers=header, cookies=cookies, timeout=60)
r.encoding = r.apparent_encoding
goods += r.text
return goods
def findMS(html):
print('=' * 20, '正在爬取商品信息', '=' * 20, '\n')
marketnames = re.findall('"nick":"(.*?)"', html)
titles = re.findall('"raw_title":"(.*?)"', html)
prices = re.findall('"view_price":"(.*?)"', html)
pays = re.findall('"view_sales":"(.*?)"', html)
data = []
try:
for i in range(len(titles)):
data.append([marketnames[i], titles[i], prices[i],pays[i]])
if data == '':
print('=' * 20, '暂无此商品信息', '=' * 20, '\n')
return data
print('=' * 20, '爬取成功', '=' * 20, '\n')
except:
print('异常,爬取中断')
return data
def download(data):
print('=' * 20, '正在保存商品信息', '=' * 20, '\n')
path = 'F:\goods.csv'
try:
f = open(path, "w", newline="")
writer = csv.writer(f)
writer.writerow(['店铺名称', '商品', '价格(单位:元)', '付款人数'])
writer.writerows(data)
print('=' * 20, '保存成功', '=' * 20, '\n')
except:
print('保存失败')
f.close()
def main():
html = getHTML()
data = findMS(html)
download(data)
if __name__ == "__main__":
main()
def getHTML()讲解
变量
- name:需要爬取的关键字
- start_url:搜索商品后主页的url
打开淘宝网主页,搜索不同的商品后通过观察发现url: https://s.taobao.com/search?q=Nike是作为向淘宝提交查询关键词的链接接口,而q为引入关键词的变量。因此搜索不同的商品,只是q的值不同了,因此我们可以通过这个url打开要搜索的商品的搜索首页。
- header:代理用户,在Chrome按F12打开页面源代码 – network – message header – request header
这里需要用到 HTTP基础知识,UA相关知识参考HTTP请求头之User-Agent path:登录淘宝开始打开持续日记以获得登录信息(在登录页面F12,选中preserve log),点击Cookie复制保存到本地文件(F:\mycookie.txt)中 - 关于cookie可以学习cookie及通过cookie常见应用,有很多通过cookie来绕过登录的示例。
这一个程序就是先进行登录,再利用cookie来绕过之后的登录,进行商品信息爬取,再之后会进一步实现自动登录。 - pages:要查询的页数,从第一页开始
- url:每页的url,有以下的观察:
起始页:
https://s.taobao.com/search?q=Nike&bcoffset=6&ntoffset=6&p4ppushleft=1%2C48&s=0点击下一页(第二页):
https://s.taobao.com/search?q=Nike&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44
点击下一页(第三页):
https://s.taobao.com/search?q=Nike&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88
结论:可以观察到第一页的s=0,第二页,第三页中的s依次等,44,88。而一页正好有44个商品,因此可以猜测s为这一页的起始商品的编号,同时也可推算第4页的s为132(果然如此!)因此只需改变s的值就可以实现跳页啦 - r为响应对象,r.text为文本信息,r.content则是以二进制输出。可以学习requests库get和post方法使用。
因此方法getHTML()的最终返回结果goods是请求目标网站得到的文本(也即HTML)通过下面的findMS方法来找寻对我们有用的信息。
def findMS(html)讲解
查看网页源代码如下:
可以发现每件商品的相关信息都是用特征值标明的,其中"nick"表示店铺名称,raw_title表示商品名称,view_price表示价格,view_sales表示购买量,还有评论数量,店铺所在地等等信息。因此我们只需要提取特征值就可以了,使用正则表达式在html文本中搜寻即可。
补充学习关于正则表达式的基础教程和re.findall用法。将信息保存到data中,i表示搜索到的商品的数量。
def download(data)详解
已经搜寻到了商品的信息,将其保存到csv文件中会更方便查看和数据对比,python读写csv这部分内容比较简单,更多的是应用。
需要改进的地方
- 现在是先登录,然后记录cookie来绕过登录,下一步要实现的就是自动登录,从自动输入账号和密码开始,其中可能遇到验证的问题;
- 观察了一下淘宝的网页源代码商品信息用各个不同的特征值表现得非常明显,因此才可以使用findall加正则表达式,而天猫的源代码则是纯html文本,没有特征值进行区分,要再多找找规律;
- 对HTTP和网络等方面非常薄弱,要加油!