赞
踩
在先前介绍过的解析和提取html内容的库,只能够处理静态文本执行简单的搜索,缺乏灵活性,不能处理动态的文本信息。
下面来介绍一下正则表达式。
. 表示任何单个字符
[]字符集,对单个字符给出取值范围,如[abc]表示a,b,c;[a-z]表示a到z单个字符
[^ ]
非字符集,对单个字符给出排除范围 ,如[^abc]
表示非a或b或c的单个字符
*
前一个字符0次或无限次扩展,如abc* 表示 ab、abc、abcc、abccc等
+
前一个字符1次或无限次扩展 ,如abc+ 表示 abc、abcc、abccc等
?
前一个字符0次或1次扩展 ,如abc? 表示 ab、abc
|
左右表达式任意一个 ,如abc|def 表示 abc、def
{m}
扩展前一个字符m次 ,如ab{2}c表示abbc
{m,n}
扩展前一个字符m至n次(含n) ,如ab{1,2}c表示abc、abbc
^
匹配字符串开头 ,如^abc表示abc且在一个字符串的开头
$
匹配字符串结尾 ,如abc$表示abc且在一个字符串的结尾
( )
分组标记,内部只能使用 | 操作符 ,如(abc)表示abc,(abc|def)表示abc、def
\d
数字,等价于[0‐9]
\w
单词字符,等价于[A‐Za‐z0‐9_]
[A‐Z]
能够匹配小写字符#生成re对象:
import re
content = 'hello, i am a boy'
regex = re.compile('\w*')
sentence = regex.match(content)
sentence.group()
#调用函数
sentence = re.match('\w*', content)
sentence.group()
content = 'hello, i am a boy'
sentence = re.match('\w.*', content)
sentence.group()
sentence = re.match('\w....*?',content)
sentence.group()
目标任务:淘宝商品比价定向爬虫
本次任务不是爬取简单的公开网站,而是需要进行登录的网站。
user-agent:浏览器的请求头,伪装成浏览器访问
cookie:某些网站为了辩护用户身份,进行Session跟踪而储存在用户本地终端上的数据(通产进行加密),由用户客户端计算机暂时或永久保存的信息
爬取网址:https://s.taobao.com/search?q=书包&js=1&stats_click=search_radio_all%25
爬取思路:
#导入包
import requests
import re
def getHTMLText(url): """ 请求获取html,(字符串) :param url:爬取网址 :return:字符串 """ try: #添加头信息。 kv = { 'cookie':'thw=cn; t=3a4bdb8ce710f4e08f06672eff50e11f; tracknick=%5Cu5B81%5Cu5B811506; enc=32crCvME19D5T1NsQOG7tM3gDhuldVnNxF5w1zi5Im8mzrEvaY5QTtwKNlQwxLBX0HzHlkoP3d7rEhajqxc10g%3D%3D; alitrackid=blog.csdn.net; _samesite_flag_=true; cookie2=17521ca57c5c81794cdfbef9bc911b57; _tb_token_=748de15575973; sgcookie=ELBr4B6ocMPiPRnpCjUuD; unb=1836673364; uc3=nk2=pzbgZmfhJt8%3D&lg2=WqG3DMC9VAQiUQ%3D%3D&id2=UonYtwYyCmtNnA%3D%3D&vt3=F8dBxGR00GvTSr%2Foeq4%3D; csg=a5febed0; lgc=%5Cu5B81%5Cu5B811506; cookie17=UonYtwYyCmtNnA%3D%3D; dnk=%5Cu5B81%5Cu5B811506; skt=4810f4df38a08bb5; existShop=MTU4NzczMTI5MQ%3D%3D; uc4=nk4=0%40pQCSQaNt9vUvrb9b%2Frbk64nNPg%3D%3D&id4=0%40UOEy0PVcvmzEYslIV%2BnxO7u8WPBq; _cc_=UtASsssmfA%3D%3D; _l_g_=Ug%3D%3D; sg=64e; _nk_=%5Cu5B81%5Cu5B811506; cookie1=AnOUmyuG%2FSGOMG%2FTgbi6kT4HmCgSwMuD7OzFxs1fmH4%3D; tfstk=ctd5B0qAeuqWrUAzgHgVUhUj1YCCZ9PfoSj2PKKv6lnE2KT5iyNNfvfdPoNABZ1..; lastalitrackid=login.taobao.com; uc1=cookie16=U%2BGCWk%2F74Mx5tgzv3dWpnhjPaQ%3D%3D&cookie21=VT5L2FSpccLuJBreK%2BBd&cookie15=WqG3DMC9VAQiUQ%3D%3D&existShop=false&pas=0&cookie14=UoTUPcvNlDaTLA%3D%3D; mt=ci=98_1; v=0; JSESSIONID=07211823E845B1F60CC7BFC7059495D2; isg=BNracrXJUHfcN9wJi-nwL8XlK4D8C17lvKS64eRTJ204V3mRzJj29eplJyNLh9Z9; l=eBxTR0u7QyjArwtDBO5wlurza779NIRf1sPzaNbMiIHca6HFTFgYxNQc0yPW7dtjgtfAQetrhV5GsRnkSMUKg2HvCbKrCyCloxJw-', 'user-agent':'Mozilla/5.0' } r = requests.get(url, timeout=30, headers=kv) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return '爬取失败'
def parsePage(glist, html): """ 解析网页,搜索需要的信息 :param glist:列表作为存储容器 :return:商品信息的列表 """ try: #使用正则表达式提取信息 price_list = re.findall(r'\"view_price"\:\"[\d\.]*\"',html) name_list = re.findall(r'\"raw_title\"\:\".*?\"',html) for i in range(len(price_list)): price = eval(price_list[i].split(":")[1]) name = eval(name_list[i].split(":")[1]) glist.append([price, name]) except: print('解析失败')
def printGoodList(glist):
tplt = "{0:^4}\t{1:^6}\t{2:^10}"
print(tplt.format("序号", "商品价格", "商品名称"))
count = 0
for g in glist:
count = count + 1
print(tplt.format(count, g[0], g[1]))
# 根据页面url的变化寻找规律,构建爬取url goods_name = "书包" # 搜索商品类型 start_url = "https://s.taobao.com/search?q=" + goods_name info_list = [] page = 3 # 爬取页面数量 count = 0 for i in range(page): count += 1 try: url = start_url + "&s=" + str(44*i) html = getHTMLText(url)#爬取url parsePage(info_list, html)#解析HTMl和爬取内容 print('\r爬取页面当前进度:{:.2f}%'.format(count*100/page),end='')#显示进度条 except: continue
printGoodList(info_list)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。