โปรแกรมรวบรวมข้อมูลเว็บการเรียนรู้ Python ส่วนใหญ่แบ่งออกเป็นสามส่วนหลัก: การรวบรวม ข้อมูล การวิเคราะห์ และ การจัดเก็บ
นอกจากนี้ Scrapy เฟรมเวิร์กของโปรแกรมรวบรวมข้อมูลที่ใช้กันทั่วไปมากกว่าจะกล่าวถึงรายละเอียดที่นี่ในตอนท้าย
อันดับแรก เรามาแสดงรายการบทความที่เกี่ยวข้องที่ฉันสรุปไว้ ซึ่งครอบคลุมแนวคิดและทักษะพื้นฐานที่จำเป็นในการเริ่มต้นใช้งานโปรแกรมรวบรวมข้อมูลเว็บ: Ning Ge’s Small Station - Web Crawler
เมื่อเราป้อน URL ในเบราว์เซอร์แล้วกด Enter จะเกิดอะไรขึ้นในเบื้องหลัง? เช่นถ้าเข้า http://www.lining0806.com/ ก็จะเห็นหน้าแรกของเว็บพี่หนิง
พูดง่ายๆ ก็คือ กระบวนการนี้เกิดขึ้นในสี่ขั้นตอนต่อไปนี้:
สิ่งที่โปรแกรมรวบรวมข้อมูลเว็บต้องทำคือนำฟังก์ชันของเบราว์เซอร์ไปใช้ ด้วยการระบุ URL ข้อมูลที่ผู้ใช้ต้องการจะถูกส่งกลับโดยตรง โดยไม่ต้องจัดการเบราว์เซอร์ด้วยตนเองเพื่อรับข้อมูลทีละขั้นตอน
ในขั้นตอนนี้ต้องชี้แจงก่อนว่าต้องการรับเนื้อหาอะไรบ้าง? เป็นซอร์สโค้ด HTML หรือสตริงในรูปแบบ Json เป็นต้น
กรณีการตระเวนส่วนใหญ่ได้รับการร้องขอ นั่นคือ การได้รับข้อมูลโดยตรงจากเซิร์ฟเวอร์ของบุคคลอื่น
ก่อนอื่น Python มาพร้อมกับสองโมดูล urllib และ urllib2 ซึ่งโดยทั่วไปสามารถตอบสนองการรวบรวมข้อมูลหน้าทั่วไปได้ นอกจากนี้ คำขอยังเป็นแพ็คเกจที่มีประโยชน์มาก เช่นนี้มี httplib2 เป็นต้น
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
นอกจากนี้ สำหรับ URL ที่มีฟิลด์การสืบค้น โดยทั่วไปแล้ว คำขอรับจะผนวกข้อมูลที่ร้องขอเข้ากับ URL เพื่อแยก URL และส่งข้อมูล พารามิเตอร์หลายตัวเชื่อมต่อกับ &
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)
สิ่งอ้างอิงที่เกี่ยวข้อง: การตรวจสอบการรวบรวมข้อมูลการจัดอันดับข่าวของ NetEase
โครงการอ้างอิง: โปรแกรมรวบรวมข้อมูลพื้นฐานที่สุดของโปรแกรมรวบรวมข้อมูลเว็บ: การรวบรวมข้อมูลการจัดอันดับข่าว NetEase
2.1 เข้าสู่ระบบโดยใช้แบบฟอร์ม
สถานการณ์นี้เป็นคำขอโพสต์ นั่นคือ ข้อมูลแบบฟอร์มจะถูกส่งไปยังเซิร์ฟเวอร์ก่อน จากนั้นเซิร์ฟเวอร์จะเก็บคุกกี้ที่ส่งคืนไว้ในเครื่อง
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 เข้าสู่ระบบโดยใช้คุกกี้
การใช้คุกกี้เพื่อเข้าสู่ระบบ เซิร์ฟเวอร์จะคิดว่าคุณเป็นผู้ใช้ที่เข้าสู่ระบบ ดังนั้นจึงจะส่งเนื้อหาที่เข้าสู่ระบบกลับมาให้คุณ ดังนั้น หากจำเป็นต้องใช้รหัสยืนยัน คุณสามารถใช้คุกกี้เพื่อเข้าสู่ระบบด้วยรหัสยืนยันได้
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
หากมีรหัสยืนยัน จะไม่สามารถใช้การตอบกลับ = request_session.post(url=url_login, data=data) ได้ในขณะนี้ วิธีการควรเป็นดังนี้:
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!
สิ่งอ้างอิงที่เกี่ยวข้อง: การเข้าสู่ระบบรหัสยืนยันโปรแกรมรวบรวมข้อมูลเว็บ
โครงการอ้างอิง: ชื่อผู้ใช้โปรแกรมรวบรวมข้อมูลเว็บ รหัสผ่าน และการเข้าสู่ระบบรหัสยืนยัน: การรวบรวมข้อมูลเว็บไซต์ Zhihu
3.1 การใช้พรอกซี
สถานการณ์ที่เกี่ยวข้อง: การจำกัดที่อยู่ IP ยังสามารถแก้ปัญหาที่ต้องป้อนรหัสยืนยันเพื่อเข้าสู่ระบบเนื่องจากการ "คลิกบ่อย"
ในกรณีนี้ วิธีที่ดีที่สุดคือการรักษาพร็อกซี IP พูลไว้ มี IP พร็อกซีฟรีมากมายบนอินเทอร์เน็ต และมีทั้งดีและไม่ดี คุณสามารถค้นหาอันที่สามารถนำมาใช้ผ่านการคัดกรองได้ สำหรับ "การคลิกบ่อยครั้ง" เรายังสามารถหลีกเลี่ยงการถูกแบนโดยเว็บไซต์ได้ด้วยการจำกัดความถี่ของโปรแกรมรวบรวมข้อมูลในการเยี่ยมชมเว็บไซต์
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 การตั้งเวลา
สถานการณ์ที่ใช้งานได้: สถานการณ์ความถี่ที่จำกัด
ทั้งคำขอและ Urllib2 สามารถใช้ฟังก์ชัน sleep() ของไลบรารีเวลาได้:
import time
time.sleep(1)
3.3 ปลอมตัวเป็นเบราว์เซอร์หรือต่อสู้กับ "การต่อต้านฮอตลิงก์"
เว็บไซต์บางแห่งจะตรวจสอบว่าคุณเข้าถึงข้อมูลดังกล่าวผ่านเบราว์เซอร์จริง ๆ หรือไม่ หรือเครื่องเข้าถึงโดยอัตโนมัติหรือไม่ ในกรณีนี้ เมื่อบวกกับ User-Agent แสดงว่าคุณกำลังเข้าถึงผ่านเบราว์เซอร์ บางครั้งระบบจะตรวจสอบว่าข้อมูลผู้อ้างอิงรวมอยู่ด้วยหรือไม่ และผู้อ้างอิงของคุณถูกกฎหมายหรือไม่ ซึ่งโดยปกติจะบวกกับผู้อ้างอิงด้วย
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)
ไม่มากที่จะพูด
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
หรือ
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
ด้วยวิธีนี้ เราสามารถใช้ multi_session หรือ multi_open เพื่อรักษาเซสชันหรือตัวเปิดที่โปรแกรมรวบรวมข้อมูลบันทึกไว้
นี่คือการเปรียบเทียบเชิงทดลองของการรวบรวมข้อมูลแบบขนานสำหรับ Wall Street News: การรวบรวมข้อมูลแบบหลายกระบวนการของ Python และการรวบรวมข้อมูลแบบเธรดเดียวและแบบหลายเธรดของ Java
สิ่งอ้างอิงที่เกี่ยวข้อง: การเปรียบเทียบวิธีการคำนวณแบบหลายกระบวนการและแบบมัลติเธรดใน Python และ Java
สำหรับกรณี "โหลดเพิ่มเติม" ให้ใช้ Ajax เพื่อถ่ายโอนข้อมูลจำนวนมาก
วิธีการทำงาน: หลังจากโหลดซอร์สโค้ดของหน้าเว็บจาก URL ของหน้าเว็บแล้ว โปรแกรม JavaScript จะถูกดำเนินการในเบราว์เซอร์ โปรแกรมเหล่านี้โหลดเนื้อหามากขึ้นและ "เติม" หน้าเว็บ ด้วยเหตุนี้หากคุณไปรวบรวมข้อมูล URL ของหน้าเว็บโดยตรง คุณจะไม่พบเนื้อหาจริงของหน้าเว็บนั้น
ที่นี่ หากคุณใช้ Google Chrome เพื่อวิเคราะห์ลิงก์ที่เกี่ยวข้องกับ "คำขอ" (วิธีการ: คลิกขวา → ตรวจสอบองค์ประกอบ → เครือข่าย → ล้าง คลิก "โหลดเพิ่มเติม" ลิงก์ GET ที่เกี่ยวข้องจะปรากฏขึ้นและค้นหาประเภทข้อความ/ html คลิกเพื่อดูพารามิเตอร์รับ หรือคัดลอก URL คำขอ) กระบวนการวนซ้ำ
ซีลีเนียมเป็นเครื่องมือทดสอบอัตโนมัติ สามารถควบคุมเบราว์เซอร์ รวมถึงการเติมอักขระ การคลิกเมาส์ การได้มาขององค์ประกอบ การสลับหน้า และชุดการดำเนินการ กล่าวโดยสรุปคือ Selenium สามารถทำทุกอย่างที่เบราว์เซอร์สามารถทำได้
รายการที่นี่คือรหัสที่ใช้ซีลีเนียมเพื่อดึงข้อมูลค่าโดยสารแบบไดนามิกจาก Qunar.com หลังจากรายชื่อเมืองที่กำหนด
โครงการอ้างอิง: โปรแกรมรวบรวมข้อมูลเว็บ Selenium ใช้การเข้าสู่ระบบพร็อกซี: เว็บไซต์รวบรวมข้อมูล Qunar
สำหรับสถานการณ์ที่เว็บไซต์มีรหัสยืนยัน เรามีสามวิธี:
มีการพูดคุยถึงการใช้พรอกซีและการใช้คุกกี้เพื่อเข้าสู่ระบบแล้ว ตอนนี้เรามาพูดถึงการระบุรหัสยืนยันกันดีกว่า
คุณสามารถใช้ระบบโอเพนซอร์ส Tesseract-OCR เพื่อดาวน์โหลดและจดจำรูปภาพรหัสยืนยัน และถ่ายโอนอักขระที่รู้จักไปยังระบบรวบรวมข้อมูลสำหรับการเข้าสู่ระบบจำลอง แน่นอน คุณยังสามารถอัปโหลดรูปภาพรหัสยืนยันไปยังแพลตฟอร์มการเข้ารหัสเพื่อระบุตัวตนได้ หากไม่สำเร็จ คุณสามารถอัปเดตรหัสยืนยันอีกครั้งจนกว่าจะสำเร็จ
โครงการอ้างอิง: โครงการระบุรหัสยืนยันเวอร์ชัน 1: Captcha1
มีสองประเด็นที่ต้องคำนึงถึงเมื่อทำการรวบรวมข้อมูล:
หลังจากรวบรวมข้อมูลแล้ว เนื้อหาที่รวบรวมข้อมูลจะถูกวิเคราะห์ ไม่ว่าเนื้อหาใดก็ตามที่คุณต้องการ คุณสามารถแยกเนื้อหาที่เกี่ยวข้องออกมาได้
เครื่องมือวิเคราะห์ทั่วไป ได้แก่ นิพจน์ทั่วไป, BeautifulSoup, lxml ฯลฯ
หลังจากวิเคราะห์สิ่งที่เราต้องการแล้ว ขั้นตอนต่อไปคือการจัดเก็บ
เราสามารถเลือกบันทึกเป็นไฟล์ข้อความ หรือฐานข้อมูล MySQL หรือ MongoDB เป็นต้น
มีสองประเด็นที่ต้องคำนึงถึงเมื่อจัดเก็บ:
Scrapy เป็นเฟรมเวิร์กโปรแกรมรวบรวมข้อมูล Python แบบโอเพ่นซอร์สที่ใช้ Twisted ซึ่งใช้กันอย่างแพร่หลายในอุตสาหกรรม
สำหรับเนื้อหาที่เกี่ยวข้อง คุณสามารถดูการสร้างโปรแกรมรวบรวมข้อมูลเว็บโดยใช้ Scrapy ในเวลาเดียวกัน โค้ดโปรเจ็กต์การรวบรวมข้อมูลการค้นหา WeChat ที่นำมาใช้ในบทความนี้จะมอบให้เป็นข้อมูลอ้างอิงในการเรียนรู้
โครงการอ้างอิง: ใช้ Scrapy หรือคำขอเพื่อรวบรวมข้อมูลผลการค้นหา WeChat แบบเรียกซ้ำ
โปรแกรมรวบรวมข้อมูลเว็บที่ดีต้องปฏิบัติตาม โปรโตคอล Robots ก่อน ชื่อเต็มของโปรโตคอล Robots (หรือที่เรียกว่าโปรโตคอลของโปรแกรมรวบรวมข้อมูล โปรโตคอลของโรบ็อต ฯลฯ) คือ "โปรโตคอลการยกเว้นของโรบอต" เว็บไซต์ใช้โปรโตคอลของโรบ็อตเพื่อบอกเครื่องมือค้นหาว่าหน้าใดที่สามารถรวบรวมข้อมูลได้ และหน้าใดที่ไม่สามารถรวบรวมข้อมูลได้
วางไฟล์ข้อความ robots.txt (เช่น https://www.taobao.com/robots.txt) ลงในไดเร็กทอรีรากของเว็บไซต์ ในนั้น คุณสามารถระบุหน้าที่โปรแกรมรวบรวมข้อมูลเว็บต่างๆ สามารถเข้าถึงได้และหน้าที่เข้าถึงได้ ห้ามมิให้เข้าถึงเพจที่ระบุโดยกฎทั่วไป ก่อนที่โปรแกรมรวบรวมข้อมูลเว็บจะรวบรวมเว็บไซต์นี้ โปรแกรมรวบรวมข้อมูลจะได้รับไฟล์ข้อความ robots.txt ก่อน จากนั้นจึงแยกวิเคราะห์กฎในนั้น จากนั้นจึงรวบรวมข้อมูลเว็บไซต์ตามกฎ
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
หมายเหตุ: คำภาษาอังกฤษจะต้องเป็นตัวพิมพ์ใหญ่ เครื่องหมายทวิภาคเป็นภาษาอังกฤษ มีช่องว่างหลังเครื่องหมายทวิภาค
禁止所有机器人访问
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: /