当前位置: 首页 > news >正文

layui获取input信息_爬虫实战:运用requests库和正则表达式爬取淘宝商品信息。

79fda77c2ced160e05c02490f3659266.png

虽然现在淘宝的反爬措施比以前要强很多了,但是爬取淘宝的商品信息还是相对比较简单的,下面就让我们来爬取淘宝上“红米K20 Pro手机壳”的标题、价格、店家城市、销量。如图。

4a77a00398b531616604061fc497f172.png

首先,必须要先登录自己的淘宝账号(爬取时必须要登陆才能获取到能爬取到页面信息的cookie,不然过不了反爬),然后在搜索页面按F12,再然后按F5刷新页面。这时,打开Network-Doc-左侧“name”下的第一条,点击Headers,里面会有cookie和uaer-agent两条信息,在编写程序的时候需要将其复制下来,并用字典类型保存它们。(这里因为有cookie就不放图了)。

headers

在我们爬取信息时,有时候需要爬取的信息并不止一页,所以我们要观察一下淘宝的翻页时候链接的变化。这里从第二页开始。

05bf1ac986eceddf9e1dadcfc51b30b7.png
(上面的链接为第二页,下面的为第三页)

通过观察我们上面两个链接,我们可以发现翻页之后链接发生变化的是后半部分,在最后“s=44”变为了“s=88”,我把它们分别改为的“s=0”,发现都访问了商品的第一页。因此,我们可以得出结论:第一页的链接最后为“s=0”,每次翻页最后“s=”后的数字都会增加44,这是因为淘宝每一页的商品数就为44。所以我们可以利用这个规律完成翻页操作。

观察和准备的工作做完,我们可以开始编写代码了。首先导入我们要用到的库。

import requests
import re #正则表达式库
import time
import random

然后编写第一个函数,作用是获取页面内容。

def get_htmltext(url):
    try:
        headers={
            "user-agent": "(自己的信息)",
            "cookie":"(自己的信息)"
        }
        r=requests.get(url,headers=headers,timeout=30) #发送请求
        r.raise_for_status()
        r.encoding=r.apparent_encoding #获取网站真正的编码方式,并且赋给程序判断的编码方式
        return r.text
    except:
        print("获取页面失败。")
        return ""

接下来我们要获取商品的有用信息并打印在屏幕上,这些信息在网页源代码中。所以首先我们点击右键,查看网页源代码,并且随机查找一个商品的信息,如图。

a865cfb6e0f6b4d75896d5edca1b03e0.png
查找图中这个“26.00“元的商品。

84a50392eba1491f091005d42f900f20.png
在网页源代码中查找其信息

通过观察,我们可以发现商品的标题在"raw_title"之后,而价格、店家城市、销量这些信息则分别在"view_price"、"item_loc"和"view_sales"之后。得知这些信息之后我们可以继续编写代码了。

编写第二个函数,作用是获取商品的有用信息并打印。

def get_and_print_imformation(get_htmltext,url):
    resultPrice = re.findall(r'"view_price":"([d]*[.]{1}[d]*)"', get_htmltext(url))
    resultTitle = re.findall(r'"title":"(.*?)"', get_htmltext(url))
    resultLocal = re.findall(r'"item_loc":"(.*?)"', get_htmltext(url))
    resultSales_Volume = re.findall(r'"view_sales":"([d].*?)"', get_htmltext(url))
    for i in range(0, len(resultTitle), 1): #find.all函数返回的是列表,用for循环来打印
        print("%s:%s" % ("商品标题", resultTitle[i]))
        print("%s:%s" % ("价格", resultPrice[i]))
        print("%s:%s" % ("店家城市", resultLocal[i]))
        print("%s:%s" % ("付款人数", resultSales_Volume[i]))
        print("n")

这里使用了正则表达式,正则表达式的用法在这里就不详细赘述了。

最后编写main函数并调用,使程序运行。

def main():
    dep=(int)(input("输入要爬取的页数:"))
    b=1 #当前页数
    print("n")
    for sum in range(0,dep*44,44):
        print("第%d页:n"%(b))
        url="https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=%E7%BA%A2%E7%B1%B3k20Pro%E6%89%8B%E6%9C%BA%E5%A3%B3&suggest=history_2&_input_charset=utf-8&wq=%E7%BA%A2%E7%B1%B3&suggest_query=%E7%BA%A2%E7%B1%B3&source=suggest&bcoffset=1&ntoffset=1&p4ppushleft=2%2C48&s="+str(sum)
        get_htmltext(url)
        get_and_print_imformation(get_htmltext,url)
        while(b<dep):
            sleeptime = random.randint(10, 15)
            print("间隔%d秒后爬取下一页。n"%sleeptime)
            time.sleep(sleeptime) #使程序休眠一小段随机时间再爬取下一页,伪装成接近真人的翻页频率,避免因翻页过快被反爬检测到。
            break
        b=b+1

main()

完整程序如下:

import requests
import re
import time
import random

def get_htmltext(url):
    try:
        headers={
            "user-agent": "(自己的信息)",
            "cookie":"(自己的信息)"
        }
        r=requests.get(url,headers=headers,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        print("获取页面失败。")
        return ""

def get_and_print_imformation(get_htmltext,url):
    resultPrice = re.findall(r'"view_price":"([d]*[.]{1}[d]*)"', get_htmltext(url))
    resultTitle = re.findall(r'"title":"(.*?)"', get_htmltext(url))
    resultLocal = re.findall(r'"item_loc":"(.*?)"', get_htmltext(url))
    resultSales_Volume = re.findall(r'"view_sales":"([d].*?)"', get_htmltext(url))
    for i in range(0, len(resultTitle), 1):
        print("%s:%s" % ("商品标题", resultTitle[i]))
        print("%s:%s" % ("价格", resultPrice[i]))
        print("%s:%s" % ("店家城市", resultLocal[i]))
        print("%s:%s" % ("付款人数", resultSales_Volume[i]))
        print("n")

def main():
    dep=(int)(input("输入要爬取的页数:"))
    b=1
    print("n")
    for sum in range(0,dep*44,44):
        print("第%d页:n"%(b))
        url="https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=%E7%BA%A2%E7%B1%B3k20Pro%E6%89%8B%E6%9C%BA%E5%A3%B3&suggest=history_2&_input_charset=utf-8&wq=%E7%BA%A2%E7%B1%B3&suggest_query=%E7%BA%A2%E7%B1%B3&source=suggest&bcoffset=1&ntoffset=1&p4ppushleft=2%2C48&s="+str(sum)
        get_htmltext(url)
        get_and_print_imformation(get_htmltext,url)
        while(b<dep):
            sleeptime = random.randint(10, 15)
            print("间隔%d秒后爬取下一页。n"%sleeptime)
            time.sleep(sleeptime)
            break
        b=b+1

main()

运行结果如图:

08442158898844720d1596a4de0b6bad.png

9421e42d304e9ecaac51666cc2a00274.png

4c6f0be9b489b448956ab9ebec3f6661.png

在频繁爬取之后有可能会没能在程序中获取到信息,这是因为反爬作怪封了IP,这时候打开网页搜索或换页的时候也会弹出滑块验证(如图),这时候可以过一段时间并且更换cookie和user-agent再访问,也可以用代理IP解决,这里就不详细赘述了。

9b907e0be47336e84dd6b38c8a3ea205.png

相关文章:

  • 分支结构if
  • opencv3和qt5计算机视觉应用开发pdf_计算机视觉方向简介 | 用深度学习进行表格提取...
  • Runtime 类
  • vue element tree 后台 数据转换_mallcloud商城vue
  • excel统计行数_WPS| 12个简单的Excel技巧,却能让造价人变得如此逆天!
  • RandomAccess接口
  • python用input输入list_python怎么用input函数输入一个列表
  • sublime text 2 卸载与重装
  • 数字图像中255表示什么_数字图像处理学习之(一):图像与图像的表示
  • 初见Hadoop—- 搭建MyEclipse 访问HDFS 上的文件
  • 有些网站打开一半空白_如何发一条空白的朋友圈
  • 一台服务器能承载多少用户_冰淇淋机多少钱一台?做冰淇淋也能小有成就
  • json web token 网上学习笔记
  • python中函数包括_python函数
  • bzoj1059 [ZJOI2007]矩阵游戏
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android系统模拟器绘制实现概述
  • css系列之关于字体的事
  • IDEA 插件开发入门教程
  • js算法-归并排序(merge_sort)
  • Linux Process Manage
  • Nacos系列:Nacos的Java SDK使用
  • PHP那些事儿
  • Solarized Scheme
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 复习Javascript专题(四):js中的深浅拷贝
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 解析带emoji和链接的聊天系统消息
  • 前端js -- this指向总结。
  • 入口文件开始,分析Vue源码实现
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma预处理命令
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (31)对象的克隆
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 未来三学期想要修的课 (日記)
  • .Net 6.0 处理跨域的方式
  • .NET Core 2.1路线图
  • .net refrector
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net反编译工具
  • .NET开发人员必知的八个网站
  • .NET中使用Redis (二)
  • .pop ----remove 删除
  • ::什么意思