Table des matières
Concept
1、Qu'est - ce qu'un reptile
3.URL Signification de
4. Configuration de l'environnement
Installation
Introduction
Demande de base
Basic GET Demande
Basic POST Demande
Cookies
Configuration des délais
Objet de session
SSL Validation du certificat
Agents
Sur le terrain
Code complet
Crawler,C'est - à - dire le crawler web,Tout le monde peut comprendre comme une araignée qui rampe sur le Web,Internet est comme un grand réseau,Et les reptiles sont des araignées qui rampent sur cette toile,S'il rencontre une ressource,Alors il va s'accrocher.Qu'est - ce que tu veux attraper??C'est à toi de le contrôler.. Par exemple, il récupère une page web,Il a trouvé un chemin dans ce réseau,En fait, c'est un hyperlien vers une page web,.Alors il peut ramper sur un autre Web pour obtenir des données.Voilà., Toute cette toile est à portée de main pour cette araignée , Ce n'est pas la peine de descendre dans quelques minutes .
Pendant que l'utilisateur parcourt la page , Nous pouvons voir beaucoup de belles photos ,Par exemple, Baidu Pictures-Découvrez le monde coloré , Nous allons voir quelques photos et la boîte de recherche Baidu , Ce processus est en fait une fois que l'utilisateur a entré l'URL ,Passe. DNS Serveur,Trouver l'hôte du serveur, Envoyer une requête au serveur ,Une fois le serveur résolu,Navigateur envoyé à l'utilisateur HTML、JS、CSS Attendez les documents, Le navigateur analyse , Les utilisateurs peuvent voir toutes sortes d'images . Donc,, La page que l'utilisateur voit est essentiellement composée de HTML Composé de codes , C'est ce que les reptiles rampaient , En les analysant et en les filtrant, HTML Code, Réaliser des images 、 Acquisition de ressources telles que le texte .
URL,Uniform Resource Locator, C'est ce qu'on appelle l'URL. ,Un localisateur de ressources unifié est une représentation concise de l'emplacement et des méthodes d'accès aux ressources disponibles sur Internet,Est l'adresse de la ressource standard sur internet.Chaque fichier sur Internet a un URL,Il contient des informations indiquant l'emplacement du fichier et ce que le navigateur devrait en faire.
URL Le format est en trois parties: ①La première partie est l'accord (Ou mode de service). ②La deuxième partie est l'hôte où la ressource est stockée IP Adresse (Parfois, le numéro de port est inclus). ③La troisième partie est l'adresse spécifique de la ressource hôte,Comme les répertoires et les noms de fichiers.
Un crawler doit avoir une cible pour accéder aux données URL Pour obtenir des données,Donc,, C'est la base sur laquelle les reptiles obtiennent des données , Une compréhension précise de ce que cela signifie est très utile pour l'apprentissage des reptiles .
Apprendre Python, Bien sûr, la configuration de l'environnement est essentielle , Au début, j'ai utilisé Notepad++, Mais trouver sa fonction de rappel est trop faible ,Et donc,,In Windows J'ai utilisé PyCharm,In Linux J'ai utilisé Eclipse for Python.
Utilisation pip Installation
1
$ pip install requests
Ou utiliser easy_install
1
$ easy_install requests
L'installation peut être effectuée par les deux méthodes ci - dessus .
Commençons par un petit exemple pour sentir
1 2 3 4 5 6 7 8
import requests r = requests.get('http://cuiqingcai.com') print type(r) print r.status_code print r.encoding #print r.text print r.cookies
Code ci - dessus nous avons demandé l'URL de ce site ,Le type de résultat retourné est ensuite imprimé,Code d'état,Mode de codage,Cookies Etc.. Les résultats sont les suivants
1 2 3 4
<class 'requests.models.Response'> 200 UTF-8 <RequestsCookieJar[]>
- Quoi?,C'est pratique?.Ne vous pressez pas., C'est plus pratique à l'arrière. .
requests La Bibliothèque fournit http Toutes les demandes de base .Par exemple
1 2 3 4 5
r = requests.post("http://httpbin.org/post") r = requests.put("http://httpbin.org/put") r = requests.delete("http://httpbin.org/delete") r = requests.head("http://httpbin.org/get") r = requests.options("http://httpbin.org/get")
Oui.,En un mot..
Le plus basique GET Les demandes peuvent être adressées directement à get Méthodes
1
r = requests.get("http://httpbin.org/get")
Si vous voulez ajouter des paramètres,Peut être utilisé params Paramètres
1 2 3 4 5
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get("http://httpbin.org/get", params=payload) print r.url
Résultats des opérations
1
http://httpbin.org/get?key2=value2&key1=value1
Si vous voulez demander JSON Documentation,Peut être utilisé json () Analyse méthodologique Par exemple, écrivez vous - même JSON Le nom du fichier est a.json,Il se lit comme suit:
1 2 3
["foo", "bar", { "foo": "bar" }]
Utilisez la procédure suivante pour demander et analyser
1 2 3 4 5
import requests r = requests.get("a.json") print r.text print r.json()
Les résultats sont les suivants, L'un d'eux est la sortie directe du contenu , Une autre façon est d'utiliser json () Analyse méthodologique, Sentir leur différence
1 2 3 4
["foo", "bar", { "foo": "bar" }] [u'foo', u'bar', {u'foo': u'bar'}]
Si vous voulez obtenir la réponse de socket originale du serveur ,Vous pouvez obtenir r.raw . Cependant, vous devez définir dans la demande initiale stream=True .
1 2 3 4 5
r = requests.get('https://github.com/timeline.json', stream=True) r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
Ceci permet d'obtenir le contenu original de socket de la page web . Si vous voulez ajouter headers,C'est bon. headers Paramètres
1 2 3 4 5 6
import requests payload = {'key1': 'value1', 'key2': 'value2'} headers = {'content-type': 'application/json'} r = requests.get("http://httpbin.org/get", params=payload, headers=headers) print r.url
Adoption headers Le paramètre peut augmenter headers Information
Pour POST Demande., Nous avons généralement besoin d'ajouter quelques paramètres . La méthode la plus élémentaire de transmission des paramètres peut alors être utilisée data Ce paramètre.
1 2 3 4 5
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print r.text
Résultats des opérations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
Vous pouvez voir que le paramètre a été passé avec succès , Puis le serveur a retourné les données que nous avons transmises . Parfois, l'information que nous devons transmettre n'est pas sous forme de formulaire , Il faut qu'on passe JSON Données formatées passées ,Pour que nous puissions utiliser json.dumps () Méthode de sérialisation des données du formulaire .
1 2 3 4 5 6 7
import json import requests url = 'http://httpbin.org/post' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) print r.text
Résultats des opérations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "args": {}, "data": "{\"some\": \"data\"}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "16", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": { "some": "data" }, "url": "http://httpbin.org/post" }
Par la méthode décrite ci - dessus,On peut. POST JSON Données formatées Si vous souhaitez télécharger un fichier ,Alors, directement file Les paramètres sont ok Créer un nouveau a.txt Documents, Le contenu est écrit Hello World!
1 2 3 4 5 6
import requests url = 'http://httpbin.org/post' files = {'file': open('test.txt', 'rb')} r = requests.post(url, files=files) print r.text
Vous pouvez voir les résultats de l'exécution comme suit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{ "args": {}, "data": "", "files": { "file": "Hello World!" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "156", "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
De cette façon, nous avons réussi à télécharger un fichier . requests Le téléchargement en continu est pris en charge , Cela vous permet d'envoyer de gros flux de données ou des fichiers sans avoir à les lire en mémoire .Pour utiliser streaming upload,Il suffit de fournir un objet de fichier de classe pour votre corps de requête
1 2
with open('massive-body') as f: requests.post('http://some.url/streamed', data=f)
C'est une fonction très pratique et pratique .
Si une réponse contient cookie,Alors on peut utiliser cookies Variable pour obtenir
1 2 3 4 5 6
import requests url = 'http://example.com' r = requests.get(url) print r.cookies print r.cookies['example_cookie_name']
La procédure ci - dessus n'est qu'un exemple ,Ça marche cookies Variable pour obtenir le site cookies En plus, vous pouvez utiliser cookies Variables à envoyer au serveur cookies Information
1 2 3 4 5 6
import requests url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print r.text
Résultats des opérations
1
'{"cookies": {"cookies_are": "working"}}'
Peut avoir été envoyé avec succès au serveur cookies
Peut être utilisé timeout Variable pour configurer le temps maximum de demande
1
requests.get('http://github.com', timeout=0.001)
Note::timeout Valable uniquement pour le processus de connexion,Sans rapport avec le téléchargement du corps de réponse. C'est - à - dire, Ce délai ne limite que le temps demandé . Même si elle est retournée response Contient beaucoup de contenu , Le téléchargement prend du temps ,Mais ça ne sert à rien.
Dans la demande ci - dessus , Chaque demande équivaut en fait à une nouvelle demande . C'est l'équivalent de chaque demande que nous avons ouverte individuellement avec un navigateur différent . C'est - à - dire qu'il ne s'agit pas d'une session , Même si c'est la même URL demandée .Par exemple,
1 2 3 4 5
import requests requests.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = requests.get("http://httpbin.org/cookies") print(r.text)
Le résultat est
1 2 3
{ "cookies": {} }
C'est évident, Ce n'est pas dans une session ,Impossible d'obtenir cookies, Donc dans certains sites, , Qu'est - ce qu'il faut faire pour maintenir une conversation durable ? C'est comme naviguer sur Taobao , Sautez entre les différents onglets , C'est en fait une longue conversation . La solution est la suivante:
1 2 3 4 5 6
import requests s = requests.Session() s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') r = s.get("http://httpbin.org/cookies") print(r.text)
Ici, nous avons demandé deux fois , Une fois, c'est le réglage. cookies, L'un est d'obtenir cookies Résultats des opérations
1 2 3 4 5
{ "cookies": { "sessioncookie": "123456789" } }
La découverte peut être obtenue avec succès cookies C'est, C'est comme ça qu'une session fonctionne .Expérimentez. Donc puisque la session est une variable globale , Donc nous pouvons certainement utiliser la configuration globale .
1 2 3 4 5 6
import requests s = requests.Session() s.headers.update({'x-test': 'true'}) r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) print r.text
Adoption s.headers.update La méthode est définie headers Variable de. Puis nous avons mis en place un autre headers, Que se passe - t - il? ? C'est simple., Les deux variables sont passées . Résultats des opérations
1 2 3 4 5 6 7 8 9 10
{ "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1", "X-Test": "true", "X-Test2": "true" } }
Si get Méthode headers C'est pareil. x-test Et alors??
1
r = s.get('http://httpbin.org/headers', headers={'x-test': 'true'})
Oui., Il écrasera la configuration globale
1 2 3 4 5 6 7 8 9
{ "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1", "X-Test": "true" } }
Et si vous ne voulez pas une variable dans la configuration globale ?C'est simple.,Set to None C'est tout.
1
r = s.get('http://httpbin.org/headers', headers={'x-test': None})
Résultats des opérations
1 2 3 4 5 6 7 8
{ "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" } }
Oui.,C'est tout ce qui précède. session Utilisation de base de la session
Il est partout maintenant https Site de départ,Requests Peut être HTTPS Demande de validation SSL Certificat,C'est comme... web Comme le navigateur.Pour vérifier un hôte SSL Certificat,Vous pouvez utiliser verify Paramètres Maintenant 12306 Le certificat n'est pas invalide. ,Pour tester
1 2 3 4
import requests r = requests.get('https://kyfw.12306.cn/otn/', verify=True) print r.text
Résultats
1
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
Si c'était le cas Essaie. github De
1 2 3 4
import requests r = requests.get('https://github.com', verify=True) print r.text
Oui.,Demande normale, Je ne produit pas de contenu . Si nous voulons sauter 12306 Validation du certificat pour,Prends ça. verify Set to False C'est tout.
1 2 3 4
import requests r = requests.get('https://kyfw.12306.cn/otn/', verify=False) print r.text
La découverte permet une demande normale .Par défaut verify - Oui. True,Donc si nécessaire, Cette variable doit être réglée manuellement .
Si vous avez besoin d'un agent,Vous pouvez le faire en fournissant proxies Paramètres pour configurer une seule requête
1 2 3 4 5 6 7
import requests proxies = { "https": "http://41.118.132.69:4433" } r = requests.post("http://httpbin.org/post", proxies=proxies) print r.text
Vous pouvez également utiliser les variables d'environnement HTTP_PROXY Et HTTPS_PROXY Pour configurer l'agent
1 2
export HTTP_PROXY="http://10.10.1.10:3128" export HTTPS_PROXY="http://10.10.1.10:1080"
import csv
import pymysql
import time
import pandas as pd
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
#Connexion à la base de données,Oui.csvEnregistrer le fichier dansmysqlMoyenne
def getConnect():
# ConnexionMySQLBase de données(Attention!:charsetLe paramètre estutf8Au lieu deutf-8)
conn = pymysql.connect(host='localhost',port=3307, user='root', password='liziyi123456', db='db_douban', charset='utf8')
# Créer un objet curseur
cursor = conn.cursor()
# LirecsvDocumentation
with open('mm.csv', 'r', encoding='utf-8') as f:
read = csv.reader(f)
# Ligne par ligne , Supprimer la première ligne
for each in list(read)[1:]:
i = tuple(each)
# UtiliserSQLInstruction ajouter des données
sql = "INSERT INTO movices VALUES" + str(i) # movices Est le nom de la table
cursor.execute(sql) # Mise en œuvreSQLDéclarations
conn.commit() # Présentation des données
cursor.close() # Fermer le curseur
conn.close() # Fermer la base de données
def getMovice(year):
server = Service('chromedriver.exe')
driver = webdriver.Chrome(service=server)
driver.implicitly_wait(60)
driver.get( "https://movie.douban.com/tag/#/?sort=S&range=0,10&tags="+year+",%E7%94%B5%E5%BD%B1")
driver.maximize_window()
actions = ActionChains(driver)
actions.scroll(0, 0, 0, 600).perform()
for i in range(50): #Cycle50Une fois,Rampant.1000Un film
btn = driver.find_element(by=By.CLASS_NAME, value="more")
time.sleep(3)
actions.move_to_element(btn).click().perform()
actions.scroll(0, 0, 0, 600).perform()
html = driver.page_source
driver.close()
return html
def getDetails(url): # Obtenir les détails de chaque film
option = webdriver.ChromeOptions()
option.add_argument('headless')
driver = webdriver.Chrome(options=option)
driver.get(url=url)
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
div = soup.find('div', id='info')
#spans = div.find_all('span')
ls = div.text.split('\n')
#print(ls)
data = None;
country = None;
type = None;
time = None;
for p in ls:
if re.match('Type: .*', p):
type = p[4:].split(' / ')[0]
elif re.match('Pays producteur/Régions: .*', p):
country = p[9:].split(' / ')[0]
elif re.match('Date de sortie: .*', p):
data = p[6:].split(' / ')[0]
elif re.match('Longueur du film: .*', p):
time = p[4:].split(' / ')[0]
ls.clear()
driver.quit()
name = soup.find('h1').find('span').text
score = soup.find('strong', class_='ll rating_num').text
numOfRaters = soup.find('div', class_='rating_sum').find('span').text
return {'name': name, 'data': data, 'country': country, 'type': type, 'time': time,
'score': score, 'numOfRaters': numOfRaters}
def getNameAUrl(html, year):
allM = []
soup = BeautifulSoup(html, 'lxml')
divs = soup.find_all('a', class_='item')
for div in divs:
url = div['href'] # Obtenir un lien vers le site
i = url.find('?')
url = url[0:i]
name = div.find('img')['alt'] #Obtenir le nom du film
allM.append({'Nom du film':name,'Liens':url})
pf = pd.DataFrame(allM,columns=['Nom du film','Liens'])
pf.to_csv("movice_"+year+".csv",encoding = 'utf-8',index=False)
def getMovices(year):
allM = []
data = pd.read_csv('movice_'+year+'.csv', sep=',', header=0, names=['name', 'url'])
i = int(0)
for row in data.itertuples():
allM.append(getDetails(getattr(row, 'url')))
i += 1
if i == 2:
break
print('No'+str(i)+' Ministère écrit avec succès ')
pf = pd.DataFrame(allM,columns=['name','data','country','type','time','score','numOfRaters'])
pf.to_csv("mm.csv",encoding = 'utf-8',index=False,mode='a')
if __name__ == '__main__':
# Obtenir des liens vers des films
# htmll=getMovice('2022')
# getNameAUrl(htmll,'2022')
# Obtenir les détails du film ,Enregistrer àmovice.csvMoyenne
# a=getDetails("https://movie.douban.com/subject/33459931")
# print(a)
getMovices('2022')
#getConnect()