赞
踩
pip install selenium
这边我用的火狐浏览器驱动,因为谷歌浏览器驱动设置IP代理老是失败
我是用的jupyter notebook,所以教大家一个简便办法,将Geckodriver直接上传到你的jupyter notebook里面。点击upload然后,上传。
上传后会出现在下面
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import pandas as pd
import random
import time
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
从网上整理的,如有雷同请联系删除
)ip_list=[ #ip存放地址 '118.70.144.77:3128', '113.200.105.45:8080', '116.207.131.19:8080', '119.133.16.247:4216', '113.59.99.138:8910' ] user_agent_list=[ 'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)', 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)', 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)', 'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11', 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0' ] header={ 'User-Agent':random.choice(user_agent_list)} ip={ 'http':random.choice(ip_list)}
firefox_options = Options()
firefox_options.add_argument('--proxy-server=http://'+random.choice(ip_list))###更换IP地址
driver = webdriver.Firefox(options=firefox_options)
###下面的是后面会用到的一些浏览器设置,用来优化爬取速率
#firefox_options.add_argument('--headless') ---设置无头模式,即不显示浏览器,后台运行
#firefox_options.add_argument('--disable-gpu')---不使用gpu,主要阻止图片加载
#firefox_options.set_preference('permissions.default.image', 2)---不加载图片
url='https://sh.lianjia.com/chengjiao/'
deriver.get(url)
-----我们发现上海共有224526套二手房,然而下拉网页以后,发现只显示了100个page
------而且点击100页以后不再显示下一页,这个就尴尬了,链家这边是一页显示30个二手房,100页只有3000个房子,显然与224526套差很多。直接爬是不完全的。
------为了将数据都拉下来,我们可以点击上面的筛选条件,我们根据区域和有无电梯两个条件来筛选二手房,点击一下看看(为什么选择区域来分,后面会讲)
-----显然光限制大区域和有无电梯,二手房有20294套,仍然超过了100页显示3000个的限制,因此我们再改成小区域,我们再加一个“陆家嘴”的小区域限制,发现只有1462个二手房,满足了100页条件,同时点击其他区域也可以发现一个小区域的二手房基本不会超过3000个
我们需要的实际上需要的是点击进去的这个房源的详细信息,观察这个网址发现前面的"https://sh.lianjia.com/chengjiao/"是不变的,只是后面加了一个107101760738号码,估计这个房源编号,显然是没有规律的,因此必须先把所有房源的链接给爬下来
这个url就很有灵性了,“https://sh.lianjia.com/chengjiao/“不变,后面跟了一个小区域拼音缩写"lujiazui”,然后无电梯就是"ie2”,有电梯就是"ie1"(可以自己去点一下有电梯筛选),
本人很懒,不想每个小区域都去打拼音,因此万物皆可selenium
进入浏览器,按F12进入开发者模式,如下图,点击红色框,然后选择我们想要的信息区域(蓝色框),然后下面就会定位到网页的html内容。
我们发现这个"大区域"在这个"div"里面的标签"a"里面的"href"属性中,我们右击–复制–CSS选择器(XPATH),然后复制到代码里面就是,这个就是定位用的".position > dl:nth-child(2) > dd:nth-child(2) > div:nth-child(1) > div:nth-child(1)"
------讲解一下,div,class,a,href是html的一种元素结构,详情请看 html元素结构.
我们在找数据的时候,最好是先定位<div,class="…">结构,然后再到这个结构里面去找文本和链接,由于这里div里面没有class名字,这里就先展示xpath和css_selector定位方法
By.CSS_SELECTOR就是根据CSS选择器定位,同样还有其他定位方式如BY.XPATH; BY.TAG_NAME; BY.CLASS_NAME后面会介绍用法
这里使用wait是因为当你在循环爬取网页数据时,可能会存在延迟而导致数据加载不出来,也自然就无法定位到数据,关于wait的显示等待和隐式等待以及相应的用法可以参考链接:wait用法.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, “.position > dl:nth-child(2) > dd:nth-child(2) > div:nth-child(1) > div:nth-child(1)”)))这个代码的意思是直到定位到了这个css_selector再进行下一行代码,如果超过10秒还没定位到就报错了。
wait=WebDriverWait(driver,10)##等待页面加载用
#CSS_SELECTOR定位
data=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".position > dl:nth-child(2) > dd:nth-child(2) > div:nth-child(1) > div:nth-child(1)")))
#XPATH定位
data2=wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div[1]/dl[2]/dd/div/div")))
print(data)
print(data.text)
print(data2.text)
输出
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="cec75352-93cf-49f9-8643-12ceb7412874")>
'浦东\n闵行\n宝山\n徐汇\n普陀\n杨浦\n长宁\n松江\n嘉定\n黄浦\n静安\n虹口\n青浦\n奉贤\n金山\n崇明\n上海周边'
'浦东\n闵行\n宝山\n徐汇\n普陀\n杨浦\n长宁\n松江\n嘉定\n黄浦\n静安\n虹口\n青浦\n奉贤\n金山\n崇明\n上海周边'
上面并不是我们想要的内容,因此还需要再细分, 这里不用wait的方法定位元素,是因为前面已经定位到了data,而这个数据是在前面data的基础上获取的,就不需要用wait方法定位,可以find_elements_by_tag_name方法,具体可以参考:链接: selenium 元素定位方法.
print(data.find_elements_by_tag_name('a'))
输出,这里面实际上就藏着文本内容和链接
[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="672cc707-07cd-493d-b93b-e1b842539799")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="6a994423-4c7a-4708-94a9-cf00760dd6bd")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="bbeae6e8-4357-43ff-bfa0-a2505befb182")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="f9e42dfb-d229-4515-8fde-190464016020")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="75292402-3bd9-4a59-9f27-5342a48ecb37")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="fd61e4b6-70a0-4a01-99aa-ff2c070b9eef")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="69622c53-62e7-46db-8a19-4e21becaa5b9")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="28f26ffd-f0ea-4143-a881-4773562809ad")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="de613977-d3d3-4661-be62-2bf13fe8f064")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="655529e8-74c5-4aa8-83d0-9947bc976ede")>,
<selenium.webdriver.firefox.webelement.FirefoxWebElement
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。