# 第 5 篇 Compartir: el rastreador de Python abre una nueva era en la recopilación de datos (1)

La primera experiencia del rastreador de #python
1. Introducción a los rastreadores:
a. Base teórica: los rastreadores obtienen los datos que necesitamos del sitio web, incluidos texto, audio, video, etc., pero no todos los sitios web se pueden rastrear fácilmente porque algunos propietarios de datos No quieren que se compartan, por lo que aparece anti-escalada. Puedes encontrar algunos sitios web sin anti-escalada en la etapa temprana de aprendizaje. Más tarde, puedes aumentar un poco la dificultad y jugar juegos ofensivos y defensivos.

Los rastreadores se dividen en:
rastreadores generales, como motores de búsqueda: Baidu, Google, Firefox;
rastreadores de enfoque, rastreo dirigido de una determinada página web, como red de música ligera, red de tráileres, etc., para capturar los datos correspondientes (presentamos principalmente Es centrarse en los rastreadores);

Trilogía de rastreadores: rastreo de datos -> limpieza de datos -> almacenamiento de datos (uso y administración)

b. Introducción al módulo rastreador:
# 1. No es necesario instalarlo, use directamente el módulo rastreador propio de python para aprender: de la solicitud de importación urllib;
# 2. Instale solicitudes de módulos de terceros: solicitudes de instalación pip; solicitudes de importación;

Simplemente elija uno de los anteriores para usar, la sintaxis es diferente y la función es la misma.

c. Introducción al módulo de limpieza de datos:
# 1. No es necesario instalarlo, use directamente el propio módulo de Python para aprender: importar re (filtrado de datos de expresión regular, no es necesario preocuparse por el formato de los datos que se filtrarán, el siguiente es un resumen del uso de expresiones regulares) ;
# 2. Instalar lxml: para filtrar y limpiar la información de la página web .html, F12 puede ver el código fuente de la página web: pip install lxml; from lxml import etree;

Nota:
# 1. Expresión regular re:
a. Cualquier símbolo alfanumérico tiene un formato de coincidencia correspondiente;
b. Hay dos modos en el proceso de coincidencia, modo codicioso (. ) Y modo no codicioso (. ?);
C. Reserch () La coincidencia termina una vez, findall () coincide con el final de todo el contenido;
el documento # 2.html coincide con lxml, tome la etiqueta div como ejemplo: a.//div
(significa hacer coincidir todo el contenido debajo de esta etiqueta)
b.//div[@ class = "attribute"] (que representa el contenido debajo de la etiqueta div y la etiqueta que contiene este atributo)
c.//div[@class="attribute"]/a (que representa el contenido de la etiqueta a debajo de la etiqueta de atributo) / text ( ) El contenido recuperado mediante el rastreo eliminará la etiqueta
d.//div[@class="attribute"]/a/@href (significa hacer coincidir el valor href debajo de la etiqueta a)

Lo anterior se puede usar en combinación, y el código para seleccionar el método de limpieza apropiado será más conciso.

Tal vez después de leer la introducción anterior, no entiendo, y no entro en pánico. Lo aprendí durante mucho tiempo antes de tener una epifanía. Fue mi primera experiencia. Solo ten una idea. Sígueme y obtén una epifanía.

re: filtrado de cualquier formato de datos

# #正则表达式:数据筛选&匹配
import re
通字符作为原子(匹配一个普通字符)
# a="湖南湖北广东广西"
# pat="湖北"
# result=re.search(pat,a)
# print(result)

#匹配通用字符
#\w 任意字母/数字/下划线
#\W 和小写w相反
#\d 十进制数字
#\D 除了十进制数以外的值
#\s 空白字符
#\S 非空白字符

# b="136892763900"
# pat2="1\d\d\d\d\d\d\d\d\d\d"
# print(re.search(pat2,b))

# c="@@@@@@@@@@##@!_tdyuhdihdiw"
# pat3=r"\W\w\w"
# print(re.search(pat3,c))

#匹配数字、英文、中文
# 数字 [0-9]
# 英文 [a-z][A-Z]
# 中文 [\u4e00-\u9fa5]

# d="!@#$@#@##$张三%$^%$%#@$boy#@%##$%$$@#@#23@#@#@#@##$%$%$"

# pat1=r"[\u4e00-\u9fa5][\u4e00-\u9fa5]"
# pat2=r"[a-z][a-z][a-z]"
# pat3=r"[0-9][0-9]"

# result1=re.search(pat1,d)
# result2=re.search(pat2,d)
# result3=re.search(pat3,d)

# print(result1,result2,result3)

#原子表
#定义一组平等的原子
# b="18689276390"
# pat2="1[3578]\d\d\d\d\d\d\d\d\d"
# print(re.search(pat2,b))

# c="nsiwsoiwpythonjsoksosj"
# pat3=r"py[abcdt]hon"

# print(re.search(pat2,b))
很重要的
#元字符--正则表达式中具有特殊含义的字符
# . 匹配任意字符 \n除外
# ^ 匹配字符串开始位置  ^136
# $ 匹配字符串中结束的位置 6666$
# * 重复0次1次多次前面的原子 \d*
# ? 重复一次或者0次前面的原子 \d?              .*贪婪模式   .*?非贪婪模式
# + 重复一次或多次前面的原子  \d+

d="135738484941519874888813774748687"
# pat1="..."
# pat2="^135\d\d\d\d\d\d\d\d"
# pat3=".*8687$"
pat4="8*"
pat5="8+"
print(re.findall(pat5,d))

#匹配固定次数
#{n}前面的原子出现了n次
#{n,}至少出现n次
#{n,m}出现次数介于n-m之间
# a="234ded65de45667888991jisw"
# pat1=r"\d{8,10}"
# print(re.search(pat1,a))

# #多个表达式 |
# a="13699998888"
# b="027-1234567"
# pat1=r"1[3578]\d{9}|\d{3}-\d{7}"
# print(re.search(pat1,a))

#分组 ()
# a="jiwdjeodjo@$#python%$$^^&*&^%$java#@!!!!!!!!!!!!!!13688889999!!!!!!!!!!!!!!!!!#@#$#$"
# pat=r"(python).{0,}(java).{0,}(1[3578]\d{9})"
# print(re.search(pat,a).group(3))
#group() 同group(0)就是匹配正则表达式整体结果
#group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

# a="jiwdjeodjo@$#python%$$^^&*&^%$java#@!!!!!!!!!!!!!!aaa我要自学网bbb!!!!!!!!!!!!!!!!!#@#$#$"
# pat=r"aaa(.*?)bbb"
# print(re.findall(pat,a))

**#贪婪模式和非贪婪模式**
#贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配;
#非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );
#Python里默认是贪婪的。
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>.*</div>"
# print(re.search(pat1,strr)) #贪婪模式
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>.*?</div>"
# print(re.findall(pat1,strr)) #非贪婪模式

# import re
# #compile函数---将正则表达式转换成内部格式,提高执行效率
# strr="PYTHON666Java"
# pat=re.compile(r"Python",re.I) #模式修正符:忽略大小写
# print(pat.search(strr))

# import re
# #match函数和search函数
# # match函数--匹配开头
# # search函数--匹配任意位置
# #这两个函数都是一次匹配,匹配到一次就不再往后继续匹配了
# strr="javapythonjavahtmlpythonjs"
# pat=re.compile(r"python")
# print(pat.search(strr).group())

很重要的
# import re
# #findall()   查找所有匹配的内容,装到列表中
# #finditer()  查找所有匹配的内容,装到迭代器中
# strr="hello--------hello-----------\
# ---------hello-----------------\
# ---------hello--hello----------------\
# ----------hello---------hello----hello----------"
# pat=re.compile(r"hello")
# #print(pat.findall(strr))
# data=pat.finditer(strr)
# list1=[]
# for i in data:
#  list1.append(i.group())
# print(list1)

lxml: use etiquetas para filtrar datos (ingrese a la página web -> F12 para ver el código de la página web, busque los datos de demanda -> filtrar datos con etiquetas): enlace extendido
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

2. El primer rastreador simple:
a.request + re rastreador:

from urllib import request                #python自带模块
import re                                 #正则表达式模块,用于数据筛选
import random                             #随机函数模块

# 1.网站地址:
url = "http://www.baidu.com/?tn=18029102_3_dg"
#2.浏览器选择
#伪装浏览器:多个浏览器随机选择
#a.创建自定义请求对象-----反爬虫机制
#b.反爬虫机制1:判断用户是否是浏览器访问
#c.可以通过伪装浏览器进行爬取访问
agent1 = "Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 " \
         "(KHTML, like Gecko)Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
agent2 = "Mozilla/5.0 (Linux; Android 8.1.0; ALP-AL00Build/HUAWEIALP-AL00;" \
         " wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.83 " \
         "Mobile Safari/537.36 T7/10.13 baiduboxapp/10.13.0.11 (Baidu; P1 8.1.0)"

#构造列表,随机选取浏览器
list = [agent1,agent2]
agent = random.choice(list)                       #随机数
header = {
    
    "User-Agent":agent}                     #构造请求头信息:字典格式
#print(agent)

#3.发送请求.获得响应信息
req = request.Request(url,headers = header)
reponse = request.urlopen(req).read().decode()  #解码----(编码encode)
#print(reponse)

#4.数据清洗
pat = r"<title>(.*?)</title>"   #通过正则表达式进行数据清洗
data = re.findall(pat,reponse)
#print(data)

#5.操作文件存储
f = open("wenjian.txt", "a+",encoding='utf-8')
f.write(data)
f.close()

b.requests-get método rastreador:

import requests
url = "http://www.baidu.com/s?"
header = {
    
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0;\
           Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
           Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"}
#get链接拼接
wd = {
    
    "wd","中国"}
#response = requests.request("get",url,params = wd,headers = header)
#获得get型的响应
response = requests.get(url,params = wd,headers = header)
#对响应进行编码
data1 = response.text    #返回字符串类型数据
data2 = response.content #返回二进制类型数据
data3 = data2.decode()   #返回字符串类型数据
#数据打印
print(data2)

c.requests-post método rastreador:

import requests
import re

#构造请求头信息
header = {
    
    "User-Agent":"Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit /"
        "537.36(KHTML, likeGecko) Chrome / 70.0.3538.102Safari / 537.36Edge / 18.18362"}

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
key = input("请输入想要翻译的内容:")
#post请求需要提交的参数
formdata={
    
    
"action":"FY_BY_CLICKBUTTION",
"bv":"1ca13a5465c2ab126e616ee8d6720cc3",
"client":"fanyideskweb",
"doctype":"json",
"from": "AUTO",
"i":key,
"keyfrom":"fanyi.web",
"salt":"15825444779453",
"sign":"28237f8c8331019bc43baef299570901",
"smartresult":"dict",
"to":"AUTO",
"ts":"1582544477945",
"version": "2.1"
}
response = requests.post(url,headers = header,data = formdata).text
pat = r'"tgt":"(.*?)"}]]'
result = re.findall(pat,response)
print(result)

d.requests + rastreador del método lxml:

#爬取糗事百科段子
from lxml import etree
import requests

url = 'https://www.qiushibaike.com/'
headers = {
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}

response = requests.get(url,headers=headers).content.decode()

html = etree.HTML(response)
result1 = html.xpath('//a[@crecmd-content]')
for i in range(len(result1)):
    print(result1[i].text)
    print("------------------------------------------")

Cómo encontrar contenido por etiqueta:
búsqueda de datos de rastreo Lo
anterior es un video que grabé, porque siento que algunos conocimientos, el texto aún no está lo suficientemente completo, también puede ver mi otro skr de video si está interesado.

Lo anterior es la primera experiencia de los rastreadores. Después de aprender lo anterior, creo que tenemos un conocimiento básico de los rastreadores y podemos hacer un pequeño rastreador básico. Si está interesado, puede continuar aprendiendo conmigo. Si no está interesado, le daré recomiendas un sitio, "resolución nacional" se puede considerar no en vano, quiero ver la película gratis VIP puedo ver, compré vip, pero sigo pagando por adelantado que se usará para desbloquearlo, la mayoría de la gente no se lo dije;
Parte V Compartir, actualización continua ,,,,,

Supongo que te gusta

Origin blog.csdn.net/weixin_46008828/article/details/108645192
Recomendado
Clasificación