Dalam proses merangkak, kami sering menghadapi mekanisme anti-merangkak, yang memerlukan kami menggunakan beberapa alat dan teknik untuk memintas halangan ini. Antaranya, ungkapan biasa ialah alat yang sangat penting, yang boleh membantu kami melakukan pemadanan dan pemprosesan data dalam perangkak. Di bawah, kami akan memperkenalkan cara menggunakan ungkapan biasa Python untuk merangkak dan anti-merangkak.
Ungkapan biasa ialah alat yang digunakan untuk menerangkan corak teks ia boleh menerangkan rentetan sasaran melalui beberapa simbol dan perkataan tertentu. Dalam Python, kita boleh menggunakan modul semula untuk memanipulasi ungkapan biasa.
Sebagai contoh, jika kita ingin memadankan nombor telefon (dalam format xxx-xxxx-xxxx), maka kita boleh menggunakan ungkapan biasa berikut:
import re regex = re.compile(r'd{3}-d{4}-d{4}')
Dalam ungkapan biasa ini, d
bermaksud memadankan nombor, {3}
bermaksud memadankan 3 nombor, {4}
bermaksud memadankan 4 nombor dan -
bermaksud memadankan tanda sempang. Melalui ungkapan biasa ini, kita boleh memadankan nombor telefon yang sepadan dengan corak.
Sebelum anti-merangkak, kita perlu terlebih dahulu merangkak kandungan tapak web sasaran. Dalam Python, kita boleh menggunakan perpustakaan permintaan untuk mendapatkan kandungan halaman web. Sebagai contoh, jika kita ingin mendapatkan halaman ranking filem Maoyan, kita boleh menggunakan kod berikut:
import requests url = 'https://maoyan.com/board' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get(url, headers=headers) html = response.text
Antaranya, parameter headers
ialah pengepala permintaan palsu, yang boleh membantu kami memintas beberapa anti -mekanisme crawler. response.text
mewakili kandungan halaman web yang diperoleh Sekarang kami telah memperoleh kod sumber halaman web sasaran.
Selepas mendapat kod sumber halaman web, kami perlu menggunakan ungkapan biasa untuk mengekstrak maklumat yang kami perlukan. Mengambil kedudukan filem Maoyan sebagai contoh, kami ingin mendapatkan nama dan masa tayangan semua filem dalam ranking. Dengan melihat kod sumber, kita dapati maklumat ini ada dalam teg HTML berikut:
<dd> <div class="movie-item-info"> <p class="name"><a href="/films/1211269" title="误杀" data-act="boarditem-click" data-val="{movieId:1211269}">误杀</a></p> <p class="star"> 主演:肖央,谭卓,钟南山 </p> <p class="releasetime">上映时间:2020-12-04</p> </div> <div class="movie-item-number score-num"> <p class="score"><i class="integer">9.</i><i class="fraction">7</i></p> </div> </dd>
Kita boleh menggunakan ungkapan biasa berikut untuk memadankan nama filem dan masa tayangan:
pattern = re.compile('<p class="name"><a href="/films/d+" title="(.*?)" data-act="boarditem-click".*?<p class="releasetime">(.*?)</p>', re.S)
Ini Dalam ungkapan biasa, .*?
mewakili padanan tidak tamak, iaitu, hanya memadankan kandungan teks yang diperlukan. re.S
bermakna .
boleh memadankan mana-mana watak, termasuk pemisah baris. Kini kami telah membina ungkapan biasa yang sepadan dengan tajuk filem dan masa tayangan.
Seterusnya, kita boleh menggunakan kaedah findall
ungkapan biasa untuk mengekstrak hasil yang sepadan:
movies = re.findall(pattern, html)
Operasi ini akan mengembalikan senarai, setiap elemen yang merupakan elemen Kumpulan, masing-masing mewakili nama filem dan masa tayangan. Kini kami telah berjaya merangkak semua maklumat filem dalam halaman ranking filem Maoyan.
Sebelum anti-rangkak, kita perlu memahami beberapa kaedah anti-rangkak yang biasa digunakan oleh tapak web, seperti menetapkan had kekerapan akses, menyekat IP, dll. Untuk mengelakkan mekanisme anti-crawler ini, kami perlu mensimulasikan tingkah laku biasa pengguna. Contohnya, apabila merangkak halaman ranking filem Maoyan, kita boleh menetapkan selang masa rawak untuk mensimulasikan gelagat manusia yang melayari web:
import time interval = random.uniform(0, 3) time.sleep(interval)
Dalam coretan kod ini, random.uniform(0, 3)
bermaksud menjana nombor daripada 0 hingga 3 Nombor rawak antara, time.sleep(interval)
bermaksud membiarkan program menunggu masa yang sepadan.
Sesetengah tapak web menggunakan teknologi pemuatan dinamik dalam halaman mereka, yang bermaksud mereka perlu menggunakan bahasa skrip seperti JavaScript untuk menjana kandungan halaman secara dinamik . Jika kami terus menggunakan perpustakaan permintaan untuk mendapatkan halaman jenis ini, kami hanya boleh mendapatkan kod HTML statik dan tidak boleh mendapatkan kandungan yang dijana secara dinamik. Pada masa ini, kami boleh menggunakan perpustakaan Selenium untuk mensimulasikan operasi manusia supaya penyemak imbas boleh memuatkan kandungan halaman secara normal. Contohnya, jika kami ingin mendapatkan halaman ulasan Weibo, kami boleh menggunakan kod berikut:
from selenium import webdriver url = 'https://weibo.com/xxxxxx' browser = webdriver.Firefox() browser.get(url) time.sleep(10) html = browser.page_source
Melalui kod di atas, kami boleh mendapatkan kandungan halaman yang lengkap, termasuk kawasan ulasan yang dijana oleh pemuatan dinamik.
Ringkasan
Artikel ini memperkenalkan cara menggunakan ungkapan biasa Python untuk merangkak dan anti-merangkak Kandungan utama termasuk:
Atas ialah kandungan terperinci Cara menggunakan ungkapan biasa Python untuk merangkak dan anti-merangkak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!