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

Python crawler

編輯:Python

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


Concept

1、Qu'est - ce qu'un reptile

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 .

3.URL Signification de

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 .

4. Configuration de l'environnement

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.

Installation

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 .

Introduction

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. .

Demande de base

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..

Basic GET Demande

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

Basic POST Demande

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 .

Cookies

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

Configuration des délais

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.

Objet de session

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

SSL Validation du certificat

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 .

Agents

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"

 Sur le terrain

Code complet

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()


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