今天想做一个58同城的爬虫,然后到页面分析一下链接,发现58同城的链接的有些参数是由js动态生成的,然后我就想偷懒了。(当然其实去js文件中找到生成式并不难),但我就是不想去找。然后就想到了selenium,各种工具都常拿出来溜溜,才能用的好!

python + selenium + (head_less)Chrome,然后用BeautifulSoup解析数据,完成了。

我们来一步步的看,首先我们要生成一个驱动器的对象吧

from selenium import webdriver

options = webdriver.ChromeOptions()

options.set_headless()

# 无头

options.add_argument('--diable-gpu')

# 禁用gpu

driver = webdriver.Chrome(options=options)

# 生成了一个无头的Chrome的驱动器对象

对了,我们还是把我们的目标截图看一下吧!

框起来的部分是有js文件动态生成的参数,我们的目标是箭头指向的部分。

好了,目标给你们看了,像这样的页面一共有70页,每页有60个房子的信息(别说我骗你只有4200条数据不是万级数据,那你可以换城市呀!)

首先我们实现这个页面的爬取,看代码:

content = driver.page_source.encode('utf-8')

# 获取页面资源

Soup = BeautifulSoup(content,'lxml')

# 用BeautifulSoup库进行解析,结合BeautifulSoup

li_list = Soup.find(attrs={'class':'content'}).find_next(attrs={'class':'listUl'}).find_all('li')

# 解析

for li in li_list:

try:

if li.has_attr('logr'):

# 因为渲染过的页面上还有一种公寓的信息,是我不要的,这里的这个判断语句相当于一个赛选

img_list = li.div.find_next('img').get('src')

img_num = li.find_next('span').get_text()

des = li.find(attrs={'class': 'des'})

h2 = des.h2.a.get_text()

room = des.find(attrs={'class': 'room'}).get_text()

jjr = des.find(attrs={'class': 'jjr'}).get_text(strip=True)

listliright = li.find(attrs={'class': 'listliright'})

sendtime = listliright.find(attrs={'class': 'sendTime'}).get_text()

money = listliright.find(attrs={'class': 'money'}).get_text()

writer.writerow([img_list, img_num, h2, room, jjr, sendtime, money])

# 这里是写进文件,我们传进来一个写的对象,后面会看到

else:

continue

except AttributeError:

continue

# 有错误什么的都进跳过

代码的注释很详细把,就不用说了吧,这是对一个页面的提取信息

这是一个页面,我们要进行多个页面的跳转呀,所以这时selenium的元素定位就出来了。

我们找到这个“下一页”的元素,然后点击,就可以进入下一页了!

代码如下:

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.common.exceptions import NoSuchElementException

wait_time = WebDriverWait(driver,10,0.5)

# 设置显式等待的时间

next_element = wait_time.until(EC.element_to_be_clickable((By.CLASS_NAME,'next')))

# 定位到页面的“下一页”的按钮,并进行点击

next_element.click()

# 这样就进入下一页了

好了,通过以上两步,我们就可以实现页面数据的提取和页面的跳转了,关键的两步都已经完成了,现在只剩下,数据的写入和逻辑的实现了

接下来我们对函数进行一个递归的调用,实现的代码的复用,具体的话你可能要看完整的代码了

贴出来:

# _*_ coding : utf-8 _*_

import csv

import random

from selenium import webdriver

from bs4 import BeautifulSoup

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.common.exceptions import NoSuchElementException

options = webdriver.ChromeOptions()

options.set_headless()

options.add_argument('--diable-gpu')

driver = webdriver.Chrome(options=options)

wait_time = WebDriverWait(driver,10,0.5)

# 这里设置隐式等待的时间

# 设置无头Chrome进行作业

# 直接定位到要爬取的网页,不用有一个过程的

#driver.get_screenshot_as_file('58.png')

# 截屏

#get_html = driver.find_element(By.TAG_NAME, 'html')

# 定位到这个get_html元素

def parse_dom(driver,writer):

content = driver.page_source.encode('utf-8')

# 获取页面资源

Soup = BeautifulSoup(content,'lxml')

# 用BeautifulSoup库进行解析,结合BeautifulSoup

li_list = Soup.find(attrs={'class':'content'}).find_next(attrs={'class':'listUl'}).find_all('li')

# 解析

for li in li_list:

try:

if li.has_attr('logr'):

# 因为渲染过的页面上还有一种公寓的信息,是我不要的,这里的这个判断语句相当于一个赛选

img_list = li.div.find_next('img').get('src')

img_num = li.find_next('span').get_text()

des = li.find(attrs={'class': 'des'})

h2 = des.h2.a.get_text()

room = des.find(attrs={'class': 'room'}).get_text()

jjr = des.find(attrs={'class': 'jjr'}).get_text(strip=True)

listliright = li.find(attrs={'class': 'listliright'})

sendtime = listliright.find(attrs={'class': 'sendTime'}).get_text()

money = listliright.find(attrs={'class': 'money'}).get_text()

writer.writerow([img_list, img_num, h2, room, jjr, sendtime, money])

else:

continue

except AttributeError:

continue

# 有错误什么的都进跳过

try:

next_element = wait_time.until(EC.element_to_be_clickable((By.CLASS_NAME,'next')))

# 定位到页面的“下一页”的按钮,并进行点击

next_element.click()

# 点击过后,driver对象就是下一页的内容了,这里不要纠结

# 注意:在某些时候,点击一个按钮会出现一个新的窗口,这是就要注意切换窗口了。

driver.get_screenshot_as_file('D:/selenium/{name}.png'.format(name=random.uniform(0,39)))

# 别问我这个39什么意思,什么意思也没有,我就是随便选的

# uniform是选取浮点数,如果你想用整数可以用randint

# 截频每次爬取的网页,并随机生成一个图片的名字

print(1)

# 这是我给自己视觉上的一个信号,不然我不知道它在爬取呀!!!!!

parse_dom(driver,writer)

# 进行一个递归的循环

except NoSuchElementException:

print('已经到了末尾了!')

return

# 到了末尾自然就找不到“下一页”那个元素了,这是就可以报错了

# 就可以return,停止运行了

def main():

driver.get(url='http://bj.58.com/chuzu/?PGTID=0d200001-0000-1fd1-f53b-dedf284b5de1&ClickID=1')

with open('58city.csv','a',encoding='utf-8') as f:

writer = csv.writer(f)

writer.writerow(['img_list', 'img_num', 'h2', 'room', 'jjr', 'sendtime', 'money'])

# 建立一个writer对象并写入title

parse_dom(driver,writer)

# 这个函数我实现的是一个递归的调用

if __name__ == '__main__':

main()

# 执行主函数

完成了爬取,成果的话,贴出来,不过我并没有爬完(限速的我伤不起,还要试一下怎么用scrapy结合selenium进行爬取)

如图,我大概只爬取了两千条的数据。

python爬取58同城租房信息,用selenium爬取58同城租房信息(万级数据)相关推荐

  1. python爬取酒店信息_python selenium爬取去哪儿网的酒店信息(详细步骤及代码实现)...

    准备工作 1.pip install selenium 2.配置浏览器驱动.配置其环境变量 Selenium3.x调用浏览器必须有一个webdriver驱动文件 Chrome驱动文件下载chromed ...

  2. python爬取微博评论点赞数_Python selenium爬取微博数据代码实例

    爬取某人的微博数据,把某人所有时间段的微博数据都爬下来. 具体思路: 创建driver-–get网页--找到并提取信息-–保存csv--翻页--get网页(开始循环)-----没有"下一页& ...

  3. python爬取pubmed的文献_利用selenium爬取pubmed,获得搜索的关键字最近五年发表文章数量...

    PubMed 是一个提供生物医学方面的论文搜寻以及摘要,并且免费搜寻的数据库.是一个做生物方面经常要用到的一个查找文献的网站.最近刚学了爬虫相关的知识包括urllib库,requests库,xpath ...

  4. 北上资金 python_股票数据抓取——北上基金持股数据(selenium抓取数据),爬取,之,北向,资金,通过...

    目前很多网站对爬虫都有防范措施,传统的爬数据方法不一定有效.我们只能曲线救国,通过模拟网页浏览方式爬取数据,虽然速度慢,既能达到目标又不会网站服务器增加压力,双赢吧. Python环境要先下载sele ...

  5. python已打开页面获取信息_python+selenium实现自动登录网页获取信息(一)

    我用的是一个教师继续教育的网站,进行演示和模拟,网站:http://cas.study.yanxiu.jsyxsq.com/auth/login?service=http%3A%2F%2Fwww.17 ...

  6. [Python] python + selenium 抓取 京东商品数据(商品名称,售价,店铺,分类,订单信息,好评率,评论等)

    目录 一.环境 二.简介 三.京东网页分析 1.获取商品信息入口--商品列表链接获取 2.获取商品信息入口--商品详情链接获取 3.商品详情获取 4.商品评论获取 四.代码实现 五.运行结果 六.结语 ...

  7. selenium爬取淘宝商品基础数据以及商品详情(茶叶数据)

    selenium爬取淘宝商品基础数据以及商品详情 目录 网页分析 确定要爬取的数据 分析网页构成 爬取流程 登入 爬取基础数据以及商品详情 爬取基础数据 爬取商品详情 淘宝滑动验证码 保存EXCEL中 ...

  8. python数据抓取技术与实战训练_师傅带徒弟学Python:项目实战1:网络爬虫与抓取股票数据...

    本视频基于**Python 3.X版本 本视频课程是第四篇第一个实战项目,内容包括网络爬虫技术.使用urllib爬取数据.使用Selenium爬取数据.使用正则表达式.使用BeautifulSoup库 ...

  9. python爬取58同城租房信息_分页爬取58同城租房信息.py

    import requests,re,openpyxl,os headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleW ...

最新文章

  1. python做定时任务的方式及优缺点_python BlockingScheduler定时任务及其他方式的实现...
  2. python replace函数_Python3 replace()函数使用方法
  3. 如何在你的应用中使用Jasypt来保护你的数据库用户名和密码
  4. java facets_Java UIComponent.getFacets方法代码示例
  5. POJ 3257 DP
  6. gwt的mvp模式_GWT MVP变得简单
  7. 理解 Angular 中的 $digest() 和 $apply()
  8. 【MATLAB技巧】——求解符号方程
  9. googletest,笔记20190821
  10. iOS的一些小技巧[转]
  11. 简述div标签和span标签的不同_div与span的区别是什么?
  12. php8拦截器,Web中的监听器 过滤器 拦截器
  13. java对象转换为map
  14. 机器人技术(7)AtdRobot六自由度机械臂控制教程
  15. 最小二乘法原理-线性回归
  16. elementui表格需要根据值显示文字
  17. 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
  18. 网络攻击更难预料,IoT到底是福是祸?
  19. TDMS如何用Excel打开编辑
  20. javascript高级程序设计读书笔记1

热门文章

  1. 工业互联网+安全生产 | 面向安全生产的工业互联网解决方案
  2. 微信公众号语音内容提取下载
  3. keep-alive相关用法及使用场景
  4. 怎么截取巨大日志里某一天的log
  5. 分析问题的方法论—逻辑树法则
  6. 字符串String知识总结(上) 冲冲冲!!!
  7. Data too long for column ‘xxx‘ at row 1 ——数据库字段长度太短
  8. 迄今见过最好的职业规划文章
  9. 记阿里巴巴的一次面试
  10. Ubuntu 20.04 系统自带中文输入法在PyCharm只能输入3个字母的问题