Perayap web pembelajaran Python terutama dibagi menjadi tiga bagian utama: perayapan , analisis , dan penyimpanan
Selain itu, kerangka perayap yang lebih umum digunakan, Scrapy, akan diperkenalkan secara rinci di bagian akhir.
Pertama, mari kita daftar artikel relevan yang telah saya rangkum, yang mencakup konsep dasar dan keterampilan yang diperlukan untuk memulai perayap web: Stasiun Kecil Ning Ge - Perayap Web
Saat kita memasukkan URL di browser dan menekan Enter, apa yang terjadi di latar belakang? Misalnya, jika Anda masuk ke http://www.lining0806.com/, Anda akan melihat beranda situs web Brother Ning.
Sederhananya, proses ini terjadi dalam empat langkah berikut:
Sederhananya, apa yang harus dilakukan perayap web adalah mengimplementasikan fungsi browser. Dengan menentukan URL, data yang dibutuhkan pengguna langsung dikembalikan, tanpa perlu memanipulasi browser secara manual untuk mendapatkannya langkah demi langkah.
Pada langkah ini, Anda perlu memperjelas konten apa yang ingin Anda dapatkan? Apakah itu kode sumber HTML, atau string dalam format Json, dll.
Sebagian besar kasus perayapan adalah permintaan get, yaitu memperoleh data langsung dari server pihak lain.
Pertama-tama, Python hadir dengan dua modul, urllib dan urllib2, yang pada dasarnya dapat memenuhi perayapan halaman secara umum. Selain itu, request juga merupakan paket yang sangat berguna, mirip dengan ini, ada httplib2 dan seterusnya.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
Selain itu, untuk URL dengan bidang kueri, permintaan dapatkan biasanya menambahkan data yang diminta ke URL untuk membagi URL dan mengirimkan beberapa parameter yang terhubung dengan &.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
Referensi terkait: Ulasan Perayapan Peringkat Berita NetEase
Proyek referensi: Perayap paling dasar dari perayap web: merayapi peringkat berita NetEase
2.1 Masuk menggunakan formulir
Situasi ini adalah permintaan posting, yaitu data formulir dikirim ke server terlebih dahulu, dan server kemudian menyimpan cookie yang dikembalikan secara lokal.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Masuk menggunakan cookie
Menggunakan cookie untuk masuk, server akan mengira Anda adalah pengguna yang masuk, sehingga server akan mengembalikan konten yang Anda masuki. Oleh karena itu, jika kode verifikasi diperlukan, Anda dapat menggunakan cookie untuk masuk dengan kode verifikasi.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
Jika ada kode verifikasi, respon = request_session.post(url=url_login, data=data) tidak dapat digunakan saat ini. Caranya adalah sebagai berikut:
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
Referensi terkait: Login kode verifikasi perayap web
Proyek referensi: Nama pengguna perayap web, kata sandi, dan kode verifikasi login: Merayapi situs web Zhihu
3.1 Menggunakan proksi
Situasi yang berlaku: Membatasi alamat IP juga dapat mengatasi masalah keharusan memasukkan kode verifikasi untuk masuk karena "sering klik".
Dalam hal ini, cara terbaik adalah mempertahankan kumpulan IP proxy. Ada banyak IP proxy gratis di Internet, dan ada banyak IP proksi yang baik dan buruk. Anda dapat menemukan yang dapat digunakan melalui penyaringan. Untuk “frequent click”, kita juga bisa terhindar dari banned oleh website dengan cara membatasi frekuensi crawler mengunjungi website.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 Pengaturan waktu
Situasi yang berlaku: situasi frekuensi terbatas.
Permintaan dan Urllib2 dapat menggunakan fungsi sleep() dari perpustakaan waktu:
import time
time.sleep(1)
3.3 Menyamar sebagai browser, atau melawan “anti-hotlinking”
Beberapa situs web akan memeriksa apakah Anda benar-benar mengaksesnya melalui browser, atau apakah diakses secara otomatis oleh mesin. Dalam hal ini, ditambah Agen-Pengguna, ini menunjukkan bahwa Anda mengakses melalui browser. Terkadang ia juga akan memeriksa apakah informasi Perujuk disertakan dan apakah Perujuk Anda sah, biasanya ditambah Perujuk.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
Tidak banyak bicara.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
atau
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
Dengan cara ini, kita dapat menggunakan multi_session atau multi_open untuk mempertahankan sesi atau pembuka yang ditangkap oleh crawler.
Berikut adalah perbandingan eksperimental perayapan paralel untuk Wall Street News: Perayapan multi-proses Python dan perayapan Java single-thread dan multi-thread
Referensi terkait: Perbandingan metode komputasi multi-proses dan multi-thread dengan Python dan Java
Untuk kasus "memuat lebih banyak", gunakan Ajax untuk mentransfer banyak data.
Cara kerjanya adalah: setelah memuat kode sumber halaman web dari URL halaman web, program JavaScript akan dijalankan di browser. Program-program ini memuat lebih banyak konten dan "mengisi" halaman web. Inilah sebabnya jika Anda langsung merayapi URL laman web itu sendiri, Anda tidak akan menemukan konten laman yang sebenarnya.
Di sini, jika Anda menggunakan Google Chrome untuk menganalisis tautan yang sesuai dengan "Permintaan" (metode: klik kanan → Periksa Elemen → Jaringan → Hapus, klik "Muat Lebih Banyak", tautan GET yang sesuai akan muncul dan cari Jenis teks/ html, klik untuk melihat parameter dapatkan Atau salin URL Permintaan), proses loop.
Selenium adalah alat pengujian otomatis. Itu dapat mengontrol browser, termasuk pengisian karakter, klik mouse, akuisisi elemen, peralihan halaman dan serangkaian operasi. Singkatnya, Selenium dapat melakukan apa pun yang dapat dilakukan oleh browser.
Tercantum di sini adalah kode yang menggunakan Selenium untuk secara dinamis mengambil informasi tarif dari Qunar.com setelah daftar kota tertentu.
Proyek referensi: Perayap web Selenium menggunakan login proksi: Perayapan situs web Qunar
Untuk situasi ketika situs web memiliki kode verifikasi, kami memiliki tiga metode:
Menggunakan proxy dan menggunakan cookie untuk login telah dibahas sebelumnya.
Anda dapat menggunakan sistem Tesseract-OCR sumber terbuka untuk mengunduh dan mengenali gambar kode verifikasi, dan mentransfer karakter yang dikenali ke sistem perayap untuk simulasi login. Tentu saja, Anda juga dapat mengunggah gambar kode verifikasi ke platform pengkodean untuk identifikasi. Jika tidak berhasil, Anda dapat memperbarui kembali identifikasi kode verifikasi hingga berhasil.
Proyek referensi: Proyek identifikasi kode verifikasi versi 1: Captcha1
Ada dua masalah yang perlu diperhatikan saat melakukan crawling:
Setelah dirayapi, konten yang dirayapi dianalisis. Konten apa pun yang Anda butuhkan, Anda dapat mengekstrak konten yang relevan darinya.
Alat analisis umum mencakup ekspresi reguler, BeautifulSoup, lxml, dll.
Setelah menganalisis apa yang kita butuhkan, langkah selanjutnya adalah menyimpannya.
Kita dapat memilih untuk menyimpannya ke file teks, atau ke database MySQL atau MongoDB, dll.
Ada dua hal yang perlu diperhatikan saat menyimpan:
Scrapy adalah kerangka perayap Python open source berdasarkan Twisted, yang banyak digunakan di industri.
Untuk konten terkait, Anda dapat merujuk pada pembuatan perayap web berdasarkan Scrapy. Pada saat yang sama, kode proyek perayapan pencarian WeChat yang diperkenalkan dalam artikel ini diberikan sebagai referensi pembelajaran.
Proyek referensi: Gunakan Scrapy atau Permintaan untuk merayapi hasil pencarian WeChat secara rekursif
Perayap web yang baik harus mematuhi protokol Robot terlebih dahulu. Nama lengkap protokol Robots (juga dikenal sebagai protokol perayap, protokol robot, dll.) adalah "Protokol Pengecualian Robot". Situs web menggunakan protokol Robots untuk memberi tahu mesin pencari halaman mana yang dapat dirayapi dan halaman mana yang tidak dapat dirayapi.
Tempatkan file teks robots.txt (seperti https://www.taobao.com/robots.txt) di direktori root situs web. Di dalamnya, Anda dapat menentukan halaman yang dapat diakses oleh perayap web yang berbeda dan halaman yang dapat diakses dilarang mengakses. Halaman yang ditentukan ditentukan oleh aturan reguler. Sebelum web crawler mengumpulkan situs web ini, ia terlebih dahulu memperoleh file teks robots.txt, kemudian menguraikan aturan di dalamnya, dan kemudian mengumpulkan data situs web sesuai aturan.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
Catatan: Kata dalam bahasa Inggris harus menggunakan huruf kapital. Tanda titik dua dalam bahasa Inggris. Ada spasi setelah titik dua "/" mewakili keseluruhan situs web.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /