Python-Selennium之爬虫实战--链家二手房爬虫项目

1.selenium的安装

pip install selenium

2.浏览器驱动的选用及安装

这边我用的火狐浏览器驱动,因为谷歌浏览器驱动设置IP代理老是失败

2.1下载链接: Geckodriver.

2.2安装:

我是用的jupyter notebook,所以教大家一个简便办法,将Geckodriver直接上传到你的jupyter notebook里面。点击upload然后,上传。


上传后会出现在下面
在这里插入图片描述

3.爬虫项目开始

3.1网页分析

1.先导入要用到的库
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 #等待页面加载某些元素
2.给大家一些能用的IP地址和user-agent(从网上整理的,如有雷同请联系删除)
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)}
3.设置一些浏览器选项
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)---不加载图片
4.get网页,分析url,这边只以上海地区的二手房为例
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号码,估计这个房源编号,显然是没有规律的,因此必须先把所有房源的链接给爬下来
在这里插入图片描述

5. 爬取所有二手房房源的链接
5.1 分析url,爬取大区域链接

这个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 (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="a91af058-af8f-40b1-88f9-d4212b9ce6b7")>,
 <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="95aeb76c-b4a7-4449-9779-7c778286751a")>,
 <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="9968577e-3da9-4be3-b6c0-9a199e6743cd", element="24f1e887-ab68-4b84-9969-fbaccd9e6843")>,
 <selenium.webdriver.firefox.webelement.FirefoxWebElement (session
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值