程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python crawler (3)

編輯:Python

PythonCrawler(Trois)

Un.、ajaxDemande la première page du film Bean flap

# getDemande
# Obtenez les données de la première page du film Bean flap et sauvegardez
import urllib.request
url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
headers = {

'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
# Personnalisation de l'objet demandé
request =urllib.request.Request(url=url,headers=headers)
# Obtenir les données de la réponse
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
# print(content)
# Données téléchargées localement
# open Méthode utilisée par défaut gbkCodage, Si vous voulez enregistrer des caractères chinois ,Il est nécessaire deopenLe format d'encodage spécifié dans la méthode estutf-8
# fp = open('douban.json','w',encoding='utf-8')
# fp.write(content)
fp = open('douban.json','w',encoding='utf-8')
fp.write(content)
# Ces deux lignes sont équivalentes à 
with open('douban1.json','w',encoding='utf-8') as fp:
fp.write(content)


2.、ajaxDemande les dix premières pages du film Bean flap

# Les dix premières pages du film Bean flap 
# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
# start=0&limit=20
# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
# start=20&limit=20
# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
# start=40&limit=20
# page 1 2 3 4
# start 0 20 40 60 start = (page - 1) * 20
import urllib.parse
def create_request(page):
base_url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
data = {

'start' : (page - 1)*20,
'limit' : 20 ,
}
data = urllib.parse.urlencode(data)
url = base_url + data
print(url)
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
# 1.Personnalisation de l'objet demandé
# request = urllib.request.Request()
# Entrée du programme
if __name__ == '__main__':
start_page = int(input('Veuillez saisir le numéro de page de départ'))
end_page = int(input('Veuillez entrer le numéro de la page de fin'))
for page in range (start_page , end_page + 1):
# Chaque page a une personnalisation de l'objet demandé 
create_request(page)
# print(page)


Cas complet:

import urllib.parse
import urllib.request
def create_request(page):
base_url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
data = {

'start' : (page - 1)*20,
'limit' : 20 ,
}
data = urllib.parse.urlencode(data)
url = base_url + data
print(url)
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
# 1.Personnalisation de l'objet demandé
request = urllib.request.Request(url = url , headers = headers)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_load(page,content):
with open('douban_' + str(page)+'.json' ,'w',encoding='utf-8') as fp:
fp.write(content)
# Entrée du programme
if __name__ == '__main__':
start_page = int(input('Veuillez saisir le numéro de page de départ'))
end_page = int(input('Veuillez entrer le numéro de la page de fin'))
for page in range (start_page , end_page + 1):
# Chaque page a une personnalisation de l'objet demandé 
request = create_request(page)
# 2.Obtenir les données de la réponse
content = get_content(request)
# 3.Télécharger les données
down_load(page,content)
# print(page)

Trois、ajaxDepost Demander le site Web de KFC

# Première page
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: Huangshan
# pid:
# pageIndex: 1
# pageSize: 10
# Page 2
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: Huangshan
# pid:
# pageIndex: 2
# pageSize: 10
import urllib.request
import urllib.parse
def creat_request(page):
base_url = 'https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
data = {

'cname': 'Huangshan',
'pid': '',
'pageIndex': page,
'pageSize': '10'
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
request = urllib.request.Request(url=base_url,headers=headers,data=data)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_load(page,content):
with open('kfc_'+str(page)+'.json','w',encoding='utf-8') as fp:
fp.write(content)
if __name__ == '__main__':
start_page = int(input('Veuillez entrer la page de départ'))
end_page = int(input('Veuillez entrer la page de fin'))
for page in range(start_page,end_page + 1):
# Demande de personnalisation de l'objet
request = creat_request(page)
# Obtenir le code source de la page web
content = get_content(request)
# Télécharger
down_load(page,content)


Quatre、urllibAnomalie
URLError\HTTPError

  1. HTTPErrorLa classe estURLErrorUne sous - classe de la classe
  2. Importer des paquetsurllib.error.HTTPError urllib.error.URLError(Ou importer directementurllib.error)
  3. httpErreur:http Les erreurs sont des messages d'erreur supplémentaires pour les navigateurs qui ne peuvent pas se connecter au serveur , Démarrer et dire au navigateur où se trouve le problème avec la page .
  4. AdoptionurllibLors de l'envoi de la demande, Risque d'échec de l'envoi , Si vous voulez un code plus robuste ,Peut passertry-except Pour capturer, Il existe deux types d'exceptions ,URLError\HttpError
import urllib.request
import urllib.error
url = 'https://blog.csdn.net/sulixu/article/details/1198189491'
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
try:
request = urllib.request.Request(url=url ,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
except urllib.error.HTTPError:
print('Mise à jour du système')
except urllib.error.URLError:
print(' Le système est en cours de mise à niveau ...')

Cinq、MicrobloggingcookieConnexion

# La page de renseignements personnels est utf-8, Mais une erreur de codage a été signalée , Parce qu'il n'est pas entré dans la page de renseignements personnels , Page bloquée sur la page de connexion 
# La page de connexion n'est pas utf-8Codage
import urllib.request
url = 'https://weibo.com/u/6574284471'
headers = {

# ':authority':' weibo.com',
# ':method':' GET',
# ':path':' /u/6574284471',
# ':scheme':' https',
'accept':' text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
# 'accept-encoding':' gzip, deflate, br',
'accept-language':' zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'cache-control':' max-age=0',
'cookie: XSRF-TOKEN=6ma7fyurg-D7srMvPHSBXnd7; PC_TOKEN=c80929a33d; SUB=_2A25Pt6gfDeRhGeBL7FYT-CrIzD2IHXVsxJ7XrDV8PUNbmtANLU_ikW9NRsq_VXzy15yBjKrXXuLy01cvv2Vl9GaI; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWh0duRqerzYUFYCVXfeaq95JpX5KzhUgL.FoqfS0BE1hBXS022dJLoIp-LxKqL1K-LBoMLxKnLBK2L12xA9cqt; ALF=1687489486; SSOLoginState=1655953487; _s_tentry=weibo.com; Apache=4088119873839.28.1655954158255; SINAGLOBAL=4088119873839.28.1655954158255; ULV=1655954158291:1:1:1:4088119873839.28.1655954158255':'; WBPSESS=jKyskQ8JC9Xst5B1mV_fu6PgU8yZ2Wz8GqZ7KvsizlaQYIWJEyF7NSFv2ZP4uCpwz4tKG2BL44ACE6phIx2TUnD3W1v9mxLa_MQC4u4f2UaPhXf55kpgp85_A2VrDQjuAtgDgiAhD-DP14cuzq0UDA==',
#referer Déterminer si le chemin actuel est entré par le chemin précédent ,En général, Fait pour la chaîne de capture d'images 
'referer: https':'//weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url=https%3A%2F%2Fweibo.com%2F',
'sec-ch-ua':' " Not A;Brand";v="99", "Chromium";v="102", "Microsoft Edge";v="102"',
'sec-ch-ua-mobile':' ?0',
'sec-ch-ua-platform':' "Windows"',
'sec-fetch-dest':' document',
'sec-fetch-mode':' navigate',
'sec-fetch-site':' same-origin',
'sec-fetch-user':' ?1',
'upgrade-insecure-requests':' 1',
'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44',
}
# Personnalisation de l'objet demandé
request = urllib.request.Request(url=url,headers=headers)
# Le navigateur analogique envoie une requête au serveur
response = urllib.request.urlopen((request))
# Obtenir les données de la réponse
content = response.read().decode('utf-8')
# print(content)
# Enregistrer les données localement
with open('file/weibo.html','w',encoding='utf-8') as fp:
fp.write(content)

Six、HandlerUtilisation de base du processeur
Action:
urllib.request.urlopen(url)—> Impossible de personnaliser l'en - tête de la requête
request = urllib.request.Request(url=url,headers=headers,data=data)—>L'en - tête de requête peut être personnalisé
Handler—>Personnaliser l'en - tête de demande plus avancé( Avec l'expansion de la logique d'entreprise ,La personnalisation de l'objet demandé ne répond plus à nos besoins,Par exemple:DynamiqueCookieEt l'agent ne peut pas utiliser la personnalisation de l'objet demandéi)

# Besoins:Utiliserhandler Visitez Baidu pour obtenir le code source de la page Web 
import urllib.request
url = 'http://www.baidu.com'
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
request = urllib.request.Request(url=url,headers=headers)
# handler build_opener open
# (1) AccèshandlerObjet
handler = urllib.request.HTTPHandler()
# (2) AccèsopenerObjet
opener = urllib.request.build_opener(handler)
# (3) AppelezopenMéthodes
response = opener = open(request)
content = response.read().decode('utf-8')
print(content)

Sept、Serveur mandataire
Agent rapide https://free.kuaidaili.com/free/ Accès gratuit IPEt le numéro de port

import urllib.request
url = 'http://www.baidu.com/s?wd=ip'
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
request = urllib.request.Request(url=url,headers=headers)
# response = urllib.request.urlopen(request)
# handler builder_open open
posix = {

'http': '103.37.141.69:80'
}
handler = urllib.request.ProxyHandler(proxies = posix)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('file/daili.html','w',encoding='utf-8') as fp:
fp.write(content)

Huit、Pool d'agents

import urllib.request
import random
url = 'http://www.baidu.com/s?wd=ip'
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
proxies_pool = [
{
 'http': '103.37.141.69:8011' },
{
 'http': '103.37.141.69:8022' },
{
 'http': '103.37.141.69:8033' }
]
proxies = random.choice(proxies_pool) //Sélection aléatoireIPAdresse
# print(proxies)
request = urllib.request.Request(url=url,headers=headers)
handler = urllib.request.ProxyHandler(proxies = proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('file/daili.html','w',encoding='utf-8') as fp:
fp.write(content)

Neuf、xpathPlug - in
1.InstallationxpathPlug - in:https://www.aliyundrive.com/s/YCtumb2D2J3 Code d'extraction: o4t2
2.InstallationlxmlBibliothèque

pip install lxml -i https://pypi.douban.com/simple


3.Analyse de casxpath
①Résoudre le fichier local etree.parse

## Analysexpath Une façon d'aider les utilisateurs à obtenir une partie du code source d'une page Web 
from lxml import etree
# Un.、Résoudre le fichier local etree.parse
tree = etree.parse('file/xpathRésoudre le fichier local.html')
# print(tree)
# tree.xpath('xpathChemin')
# 1.TrouverulEn bas.li
# //:Trouvez tous les noeuds descendants,Sans tenir compte des relations hiérarchiques
# /:Trouver un noeud enfant direct
# li_list = tree.xpath('//body/ul/li')
# print(li_list)
# Longueur de la liste de jugement
# print(len(li_list))
# 2.Trouvez tout ce qui aidPropriétéliÉtiquettes
# li_list = tree.xpath('//ul/li[@id]')
# text() Vous pouvez obtenir le contenu de l'étiquette 
# li_list = tree.xpath('//ul/li[@id]/text()')
# TrouveridPourl1DeliÉtiquettes Notez l'ajout de guillemets 
# li_list = tree.xpath('//ul/li[@id="l1"]/text()')
# TrouvéidPourl1DeliÉtiquetteclassValeur de l'attribut pour
# li_list = tree.xpath('//ul/li[@id="l1"]/@class')
# Requête floue idInclus danslÉtiquette de
# li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
# Requêteid De lAu débutliÉtiquettes
# li_list = tree.xpath('//ul/li[starts-with(@id,"l")]/text()')
# RequêteidPourl1EtclassPourc1De Opérations logiques
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
li_list = tree.xpath('//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text() ')
print(len(li_list))
print(li_list)

②Données de réponse du serveur response.read().decode(‘utf-8’) etree.HTML()

import urllib.request
url = 'http://www.baidu.com/'
headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44'
}
# Personnalisation de l'objet demandé
request = urllib.request.Request(url=url,headers=headers)
# Serveur d'accès au navigateur analogique
response = urllib.request.urlopen(request)
# Obtenir le code source de la page web
content = response.read().decode('utf-8')
# Analyser le code source de la page web Pour obtenir les données que vous voulez 
from lxml import etree
# Résoudre le fichier pour la réponse du serveur
tree = etree.HTML(content)
# Obtenir les données désirées xpathLa valeur de retour pour est un type de liste de données
result = tree.xpath('//input[@id ="su"]/@value')[0]
print(result)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved