Artigo Diretório
Escreva na frente
Este exemplo foi escrito pelo autor hoje enquanto estudava no MOOC da Universidade Chinesa (Instituto de Tecnologia Songtian de Pequim). Mas depois que terminei de escrever rapidamente, descobri que algo estava errado, porque depois de escrever o código de acordo com o professor, as informações não puderam ser rastreadas. Após algumas tentativas, basicamente resolvi o problema e fiz algumas otimizações. Escreva este blog Para registro, a figura a seguir é o resultado final do rastreamento.
Um, rastreie a página original
A página de rastreamento é um site do Taobao. Tomando as roupas femininas como exemplo, a imagem original é a seguinte: Como a classificação dos produtos do Taobao é atualizada em tempo real, a ordem dos resultados do rastreamento pode ser diferente da ordem do site. O conteúdo rastreado neste exemplo é o preço e o nome do produto, e um número de série é adicionado a ele.
Dois, idéias de programação
Essa parte do professor Songtian deu uma explicação na aula, aqui irei organizar e compartilhar com vocês.
1. Descrição da função
Objetivo: obter informações na página de pesquisa do Taobao e extrair o nome e o preço.
Compreensão:
(1). Obtenha a interface de pesquisa do Taobao
(2). Manuseio da virada de página
Rota técnica: requisições-re
2. O design da estrutura do programa
Etapa 1: envie uma solicitação de pesquisa de produto e obtenha as páginas em um loop.
Etapa 2: para cada página, extraia o nome do produto e as informações de preço.
Etapa 3: envie as informações na tela
Defina três funções correspondentes às três etapas acima:
(1) getHTMLText () para obter a página
(2) parsePage () para analisar cada página obtida
(3) printGoodsList () para enviar informações do produto para a tela
Três, o processo de programação
1. Resolva o problema de virar a página
Primeiro, vamos dar uma olhada nos URLs das três primeiras páginas
Observando a quantidade de produtos em cada página do Taobao, podemos descobrir que existem 44 produtos em cada página. Combinando os resultados acima, podemos adivinhar que a variável s representa o número do produto inicial na segunda, terceira ... página. Com base nesta regra, podemos construir links de URL para páginas diferentes.
código mostrado abaixo:
for i in range(depth):#对每次翻页后的URL链接进行设计
url = start_url + '&s='+str(44*i)
html = getHTMLText(url)
parsePage(infoList,html)
2. Escreva a função getHTMLText ()
def getHTMLText(url):#获得页面
try:
kv = {
'user-agent': 'Mozilla/5.0',
'cookie':' '#请自行获取
}
r = requests.get(url,headers=kv,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("获取页面失败")
Para saber como obter cookies, consulte o
link do meu blog : https://blog.csdn.net/weixin_44578172/article/details/109353017 .
3. Escreva a função parsePage ()
(1). Ideias de programação de análise de conteúdo
Primeiro, olhe o código-fonte da página de resultados da pesquisa de roupas femininas.
Observando o código-fonte, descobrimos que os preços e nomes de todas as mercadorias no Taobao estão nos pares de valores-chave correspondentes, a saber: "view_price": "price", "view_title": " nome". Portanto, se quisermos obter essas duas informações, precisamos apenas recuperar view_price e view_title no texto obtido e extrair o conteúdo relacionado subsequente.Aqui usamos o método de expressão regular.
(2). Código de função
def parsePage(ilt,html):#对每一个获得的页面进行解析
#两个变量分别是结果的列表类型和相关的HTML页面的信息
try:
re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式
re2 = re.compile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式
plt = re1.findall(html)
tlt = re2.findall(html)
#plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
#tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉
title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分
ilt.append([price,title])
except:
print("网页解析失败")
4. Escreva printGoodsList ()
def printGoodsList(ilt):#将商品的信息输出到屏幕上
try:
tplt = "{:4}\t{:8}\t{:16}" #定义打印模板
print(tplt.format("序号","价格","商品名称"))
count = 0
for s in ilt:
count = count + 1
print(tplt.format(count,s[0],s[1]))
except:
print("输出失败")
Quarto, o código completo
'''
功能描述
目标:获取淘宝搜索页面的信息,提取其中的名称和价格。
理解:
1.获得淘宝的搜索接口
2.对翻页的处理
技术路线:requests-re
程序的结构设计
步骤1:提交商品搜索请求,循环获取页面
步骤2:对于每个页面,提取商品名称和价格信息
步骤3:将信息输出到屏幕上
'''
import requests
import re
def getHTMLText(url):#获得页面
try:
kv = {
'user-agent': 'Mozilla/5.0',
'cookie':' '#请自行获取
}
r = requests.get(url,headers=kv,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("获取页面失败")
def parsePage(ilt,html):#对每一个获得的页面进行解析
#两个变量分别是结果的列表类型和相关的HTML页面的信息
try:
re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#编译商品价格正则表达式
re2 = re.compile(r'\"raw_title\"\:\".*?\"')#编译商品名称正则表达式
plt = re1.findall(html)
tlt = re2.findall(html)
#plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
#tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])#去掉view_price字段,只要价格部分,eval将获取到的最外层/内层的单引号或双引号去掉
title = eval(tlt[i].split(':')[1])#去掉raw_title字段,只要名称部分
ilt.append([price,title])
except:
print("网页解析失败")
def printGoodsList(ilt):#将商品的信息输出到屏幕上
try:
tplt = "{:4}\t{:8}\t{:16}" #定义打印模板
print(tplt.format("序号","价格","商品名称"))
count = 0
for s in ilt:
count = count + 1
print(tplt.format(count,s[0],s[1]))
except:
print("输出失败")
def main():
goods = input("请输入想要搜索的商品:") #定义搜索关键词变量
depth = input("请输入想要搜索商品的深度(整数):") #定义爬取的深度即页数
depth = int(depth)
start_url = 'https://s.taobao.com/search?q='+goods
infoList = [] #定义整个的输出结果变量
for i in range(depth):#对每次翻页后的URL链接进行设计
try:
url = start_url + '&s='+str(44*i)
html = getHTMLText(url)
parsePage(infoList,html)
except:
continue
printGoodsList(infoList)
#调用主函数
main()
No final deste artigo, indique quaisquer erros ~
Citação do
中国大学MOOC Python网络爬虫与信息提取
https://www.icourse163.org/course/BIT-1001870001