selenium+headless chrome爬虫的实现示例
作者:guduyishuai 发布时间:2022-01-31 19:29:50
标签:selenium,headless,chrome,爬虫
python爬虫写起来非常快,虽然也可以用java,但是没有python来的简洁迅速
selenium在前面总结过,是一个自动化测试库。headless chrome是 * 面的浏览器模式,和PHANTOMJS类似。但是PHANTOMJS往往会出现莫名的错误,而且速度没有headless chrome快
from selenium.webdriver.chrome.options import Options
global DRIVER
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
DRIVER = webdriver.Chrome(chrome_options=chrome_options)
爬虫的代码有一点需要注意,需要操作事件的时候最好不要直接用相应的方法,比如click。最好嵌入js脚本的方式进行调用。因为爬虫的代码执行速度很快,前端元素结构往往反应不过来,从而找出元素不可见或者不存在的错误。
province_items = DRIVER.find_element_by_class_name("city-province").find_elements_by_tag_name("a")
#province_item.click()
DRIVER.execute_script('arguments[0].click();',province_item)
下面来个例子,由于做电商平台,省、市、区的数据很好找,但是没有镇、街道的信息。这里通过爬虫从淘宝网将镇,街道的信息抓取下来
#! /usr/local/bin/python
# encoding: utf-8
'''
Created on 2018年1月5日
@author: wulinfeng
@date: 2018-1-5
'''
import time
#import request
from selenium import webdriver
#from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
import pymysql
def init_db():
global CONNECTION
CONNECTION = pymysql.connect("地址","用户名","密码","数据库" ,use_unicode=True, charset="utf8")
def init_web_driver():
global DRIVER
#DRIVER = webdriver.PhantomJS(executable_path='C:\phantomjs-1.9.2-windows\phantomjs.exe')
#DRIVER.set_window_size(1920, 1080)
'''
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36"
)
dcap["phantomjs.page.settings.viewportSize"] = (
"width: 1920, "
"height: 1080"
)
DRIVER = webdriver.PhantomJS(executable_path='C:\phantomjs-1.9.2-windows\phantomjs.exe',desired_capabilities=dcap)
DRIVER.set_window_size(1920, 1080)
'''
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
DRIVER = webdriver.Chrome(chrome_options=chrome_options)
#DRIVER=webdriver.Ie()
#DRIVER=webdriver.Chrome()
def close_db():
CONNECTION.close()
def close_web_driver():
DRIVER.quit()
def login_taobao(username, password):
DRIVER.get("https://member1.taobao.com/member/fresh/deliver_address.htm?spm=a1z08.2.0.0.7dad47611Wnj46")
#DRIVER.get("https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.201864-2.d1.7d2082a4FxukGr&f=top&redirectURL=http%3A%2F%2Fwww.taobao.com%2F")
#选择登陆方式
DRIVER.find_element_by_xpath("//*[@id=\"J_Quick2Static\"]").click()
#登陆
input_user = DRIVER.find_element_by_xpath("//*[@id=\"TPL_username_1\"]")
input_user.clear()
input_user.send_keys(username)
DRIVER.find_element_by_xpath("//*[@id=\"TPL_password_1\"]").send_keys(password)
DRIVER.find_element_by_xpath("//*[@id=\"J_SubmitStatic\"]").click();
time.sleep(0.5)
def get_data():
#点击地址选择
#DRIVER.find_element_by_xpath("//*[@id=\"city-title\"]").click()
city_title = DRIVER.find_element_by_id("city-title")
DRIVER.execute_script('arguments[0].click();',city_title)
get_province_and_sub()
def get_province_and_sub():
#获得省列表
province_items = DRIVER.find_element_by_class_name("city-province").find_elements_by_tag_name("a")
for province_item in province_items:
pid = province_item.get_attribute("attr-id");
pname = province_item.get_attribute("title");
if pid == "-1":
print("continue province")
continue
sql = "insert into region_province_t (province_id,province) values('"+pid+"','"+pname+"')"
print(sql)
cursor = CONNECTION.cursor()
cursor.execute(sql)
CONNECTION.commit()
#province_item.click()
DRIVER.execute_script('arguments[0].click();',province_item)
time.sleep(0.5)
get_city_and_sub(pid)
back_tab(0)
def get_city_and_sub(pid):
#获得市列表
city_items = DRIVER.find_element_by_class_name("city-city").find_elements_by_tag_name("a")
for city_item in city_items:
cid = city_item.get_attribute("attr-id");
cname = city_item.get_attribute("title");
if cid == "-1":
print("continue city")
continue
sql = "insert into region_city_t (city_id,city,province_id) values('"+cid+"','"+cname+"','"+pid+"')"
print(sql)
cursor = CONNECTION.cursor()
cursor.execute(sql)
CONNECTION.commit()
#city_item.click()
DRIVER.execute_script('arguments[0].click();',city_item)
time.sleep(1)
get_area_and_sub(cid)
back_tab(1)
def get_area_and_sub(cid):
#获得县区列表
area_items = DRIVER.find_element_by_class_name("city-district").find_elements_by_tag_name("a")
for area_item in area_items:
aid = area_item.get_attribute("attr-id");
aname = area_item.get_attribute("title");
if aid == "-1":
print("continue area")
continue
sql = "insert into region_area_t (area_id,area,city_id) values('"+aid+"','"+aname+"','"+cid+"')"
print(sql)
cursor = CONNECTION.cursor()
cursor.execute(sql)
CONNECTION.commit()
#area_item.click()
DRIVER.execute_script('arguments[0].click();',area_item)
time.sleep(0.5)
get_town_and_sub(aid)
back_tab(2)
def get_town_and_sub(aid):
#获得镇列表
town_items = DRIVER.find_element_by_class_name("city-street").find_elements_by_tag_name("a")
for town_item in town_items:
tid = town_item.get_attribute("attr-id");
tname = town_item.get_attribute("title");
if tid == "-1":
print("continue town")
continue
sql = "insert into region_town_t (town_id,town,area_id) values('"+tid+"','"+tname+"','"+aid+"')"
print(sql)
cursor = CONNECTION.cursor()
cursor.execute(sql)
CONNECTION.commit()
def back_tab(index):
districtEle = DRIVER.find_element_by_class_name("city-select-tab").find_elements_by_tag_name("a")[index]
DRIVER.execute_script('arguments[0].click();',districtEle)
time.sleep(0.5)
init_db()
init_web_driver()
login_taobao("用户名", "密码")
get_data()
close_db()
close_web_driver()
来源:https://blog.csdn.net/guduyishuai/article/details/78988793


猜你喜欢
- 本文为大家分享了python tkinter图形界面代码统计工具,供大家参考,具体内容如下#encoding=utf-8import os,
- filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为Tru
- 通常我们做统计图的时候需要借助组件来完成例如mschart,aspchart等但是这个类不需要任何组件,而且使用方便,本站测试可用:clsG
- pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试、自动化测试工作中。unittest也是py
- 在这里我们介绍两个拼接数组的方法:np.vstack():在竖直方向上堆叠np.hstack():在水平方向上平铺import numpy
- 交叉表(cross-tabulation,简称crosstab)是⼀种⽤于计算分组频率的特殊透视表。语法详解:pd.crosstab(ind
- 前言最近在做项目高可用时,需要使用数据同步。由于只有双节点,且采用主主同步可能存在循环同步的风险,故综合考虑采用Mysql主从同步(Mast
- Python import的搜索路径import的搜索路径为:搜索「内置模块」(built-in module)搜索 sys.path 中的
- CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的。上一篇
- 一、percona-toolkit简介percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的my
- 玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmod
- 导语学习一下golang权限控制,保留一下demo代码作为参考Casbin是什么Casbin是一个强大的、高效的开源访问控制框架,其权限管理
- 最近,小明为了达成小姐姐的愿望,在某宝买到心仪的宝贝,再加上又迷上了python,就通过python轻而易举地实现了(个人声明:对Java来
- 最近遇到了一个下载静态html报表的需求,需要以提供压缩包的形式完成下载功能,实现的过程中发现相关文档非常杂,故总结一下自己的实现。开发环境
- 0x00 字符的编码计算机毕竟是西方国家的发明,最开始并没有想到会普及到全世界,只用一个字节中的7位(ASCII)来表示字符对于现在庞大的文
- 前言 MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5
- 1.定时器Timer定时器源码实现,和自定义一个线程方式一样,都是继承Thread类,重写了run()方法,只是实现的功能是延时执行一个函数
- 1、下载安装MySQLdb类库http://www.djangoproject.com/r/python-mysql/2、修改setting
- 前言ppi-cpi 剪刀差大家可能都听说过,通过这个指标可以了解当前的经济运行状况,小编为了学习 python 的图形绘制,通过爬
- 对于一个Dict:test_dict = {1:5, 2:4, 3:3, 4:2, 5:1}想要求key值大于等于3的所有项:print({