python爬取58同城租房信息,用selenium爬取58同城租房信息(万级数据)
今天想做一个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同城租房信息(万级数据)相关推荐
- python爬取酒店信息_python selenium爬取去哪儿网的酒店信息(详细步骤及代码实现)...
准备工作 1.pip install selenium 2.配置浏览器驱动.配置其环境变量 Selenium3.x调用浏览器必须有一个webdriver驱动文件 Chrome驱动文件下载chromed ...
- python爬取微博评论点赞数_Python selenium爬取微博数据代码实例
爬取某人的微博数据,把某人所有时间段的微博数据都爬下来. 具体思路: 创建driver-–get网页--找到并提取信息-–保存csv--翻页--get网页(开始循环)-----没有"下一页& ...
- python爬取pubmed的文献_利用selenium爬取pubmed,获得搜索的关键字最近五年发表文章数量...
PubMed 是一个提供生物医学方面的论文搜寻以及摘要,并且免费搜寻的数据库.是一个做生物方面经常要用到的一个查找文献的网站.最近刚学了爬虫相关的知识包括urllib库,requests库,xpath ...
- 北上资金 python_股票数据抓取——北上基金持股数据(selenium抓取数据),爬取,之,北向,资金,通过...
目前很多网站对爬虫都有防范措施,传统的爬数据方法不一定有效.我们只能曲线救国,通过模拟网页浏览方式爬取数据,虽然速度慢,既能达到目标又不会网站服务器增加压力,双赢吧. Python环境要先下载sele ...
- python已打开页面获取信息_python+selenium实现自动登录网页获取信息(一)
我用的是一个教师继续教育的网站,进行演示和模拟,网站:http://cas.study.yanxiu.jsyxsq.com/auth/login?service=http%3A%2F%2Fwww.17 ...
- [Python] python + selenium 抓取 京东商品数据(商品名称,售价,店铺,分类,订单信息,好评率,评论等)
目录 一.环境 二.简介 三.京东网页分析 1.获取商品信息入口--商品列表链接获取 2.获取商品信息入口--商品详情链接获取 3.商品详情获取 4.商品评论获取 四.代码实现 五.运行结果 六.结语 ...
- selenium爬取淘宝商品基础数据以及商品详情(茶叶数据)
selenium爬取淘宝商品基础数据以及商品详情 目录 网页分析 确定要爬取的数据 分析网页构成 爬取流程 登入 爬取基础数据以及商品详情 爬取基础数据 爬取商品详情 淘宝滑动验证码 保存EXCEL中 ...
- python数据抓取技术与实战训练_师傅带徒弟学Python:项目实战1:网络爬虫与抓取股票数据...
本视频基于**Python 3.X版本 本视频课程是第四篇第一个实战项目,内容包括网络爬虫技术.使用urllib爬取数据.使用Selenium爬取数据.使用正则表达式.使用BeautifulSoup库 ...
- python爬取58同城租房信息_分页爬取58同城租房信息.py
import requests,re,openpyxl,os headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleW ...
最新文章
- python做定时任务的方式及优缺点_python BlockingScheduler定时任务及其他方式的实现...
- python replace函数_Python3 replace()函数使用方法
- 如何在你的应用中使用Jasypt来保护你的数据库用户名和密码
- java facets_Java UIComponent.getFacets方法代码示例
- POJ 3257 DP
- gwt的mvp模式_GWT MVP变得简单
- 理解 Angular 中的 $digest() 和 $apply()
- 【MATLAB技巧】——求解符号方程
- googletest,笔记20190821
- iOS的一些小技巧[转]
- 简述div标签和span标签的不同_div与span的区别是什么?
- php8拦截器,Web中的监听器 过滤器 拦截器
- java对象转换为map
- 机器人技术(7)AtdRobot六自由度机械臂控制教程
- 最小二乘法原理-线性回归
- elementui表格需要根据值显示文字
- 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
- 网络攻击更难预料,IoT到底是福是祸?
- TDMS如何用Excel打开编辑
- javascript高级程序设计读书笔记1