爬虫有风险,谨慎防入狱。你我皆是遵纪守法的好公民,怎么会爬虫这种面向监狱编程的技巧呢?这次就发几个简单的请求抓两条数据吧。笔者以前曾经也专门做过爬虫的工作(人称爬哥),后来见各位同行入狱笔者见事不妙跑路了,首先爬虫只是一种工具,望诸君坚守本心,在允许的情况下抓抓数据还是莫得问题的,这次笔者将使用python大法,再配合自动化神器selenium来爬个正经网站。
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。1
笔者本次爬取主要是使用Selenium的webDriver,这就是一个浏览器驱动,通过它来可以实现浏览器的一系列自动化操作,就是和我们浏览使用浏览器是一摸一样的,只是现在我们是通过代码来操作。
If you want to create robust, browser-based regression automation suites and tests, scale and distribute scripts across many environments, then you want to use Selenium WebDriver, a collection of language specific bindings to drive a browser - the way it is meant to be driven。2
使用webDriver来实现浏览器自动化操作。
Mysq想必不用再多废话了,免费开源大法就是好,总所周知的关系型数据库,本次实战用来存储爬取的数据。
整个爬虫的数据抓取思路非常简单。
使用selenium的webdriver来控制浏览器,使用pymysql操作数据库用于保存数据,使用time来设置爬取速率,间隔时间设置。
from selenium import webdriver
import pymysql
import time
获取mysql连接。
def get_conn():
conn = pymysql.connect(host="localhost",
port=你的端口,
user="你的用户",
passwd="你的密码",
db="你的db",
charset='utf8')
return conn
初始化webdriver。
driver_path = r"你的驱动位置\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
# 获取一个连接
conn = get_conn()
cursor = conn.cursor()
建表前需要根据要获取的网站信息的结构进行建表,笔者根据租房网站的信息完成了下表构建。这个主要看网站上浏览到的数据的关系来,笔者要爬取的数据条目页面上如下,所以就选取了能看到的价格户型图片等主要信息作为建表属性。
CREATE TABLE `sz` (
`image_url` varchar(255) DEFAULT NULL,
`house_type` varchar(255) DEFAULT NULL,
`apart_name` varchar(255) DEFAULT NULL,
`price` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
def goto_url():
url = "https://www.airbnb.cn/s/Shenzhen--China/homes?screen_size=medium&refinement_paths%5B%5D=%2Fhomes&place_id=ChIJkVLh0Aj0AzQRyYCStw1V7v0&click_referer=t%3ASEE_ALL%7Csid%3A342ab702-9117-480e-aee0-4983237764f0%7Cst%3AMAGAZINE_HOMES&title_type=MAGAZINE_HOMES&last_search_session_id=342ab702-9117-480e-aee0-4983237764f0"
driver.get(url)
def get_detail_info():
elements = driver.find_elements_by_class_name("_8ssblpx")
print(elements)
for element in elements:
try:
image_url = str(element.find_element_by_css_selector("._e296pg > div > div > div > a > div > img").get_attribute("src"))
house_type = str(element.find_element_by_css_selector("._10ejfg4u > div > div > a > div._1dir9an > div:nth-child(1) > div > div > span > span").text)
apart_name = str(element.find_element_by_css_selector("._10ejfg4u > div > div > a > div._1dir9an > div:nth-child(2) > div > div").text)
price = str(element.find_element_by_css_selector("._10ejfg4u > div > div > a > div._1uomq46 > div._qg0ydb > div._1orel7j7 > div > span:nth-child(2)").text)
print(sql % (image_url, house_type, apart_name, price))
cursor.execute(sql % (image_url, house_type, apart_name, price))
except Exception as e:
print(e)
conn.commit()
def goto_next():
driver.find_element_by_css_selector("#site-content > div > div > div > div._1kss53yu > div > div > div > div._99vlue > div._jro6t0 > a._za9j7e").click()
# driver.execute('document.querySelector("#site-content > div > div > div > div._1kss53yu > div > div > div > div._99vlue > div._jro6t0 > a._za9j7e").click()')
goto_url()
while True:
time.sleep(2)
get_detail_info()
time.sleep(2)
goto_next()
新年期间撸代码真是痛快,一直写代码一直爽,撸完代码写博客,这个程序还是很简单的,笔者写这个的时候一会儿就写完了,不过这也得益于笔者很久以前专门做过爬虫相关工作,对于Http,Tcp之类协议也比较熟悉,对于什么网络爬虫这不是洒洒水手到擒来,在做爬虫时应该掌握基本的html标签,http协议等相关知识,有了一定的基础后爬虫是很简单的,不过现在的反爬技术也越来越强了,还是得不断精进才能与时俱进呀!感谢诸君垂阅。
百度百科Selenium词条 ↩︎
百度百科Selenium 官网WebDriver介绍。 ↩︎